Symfony 6.3:会话过期时自动重定向用户的实现方案
Symfony 6.3 捕获会话过期并重定向至登录页
实现步骤
1. 创建会话过期监听器类
在src/EventListener/SessionExpiredListener.php中编写以下代码:
namespace App\EventListener; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Exception\SessionUnavailableException; use Symfony\Component\Security\Http\Util\TargetPathTrait; use Symfony\Component\EventDispatcher\Attribute\AsEventListener; #[AsEventListener(event: RequestEvent::class, priority: 6)] class SessionExpiredListener { use TargetPathTrait; public function __construct( private TokenStorageInterface $tokenStorage, private UrlGeneratorInterface $router, private string $loginRoute = 'app_login' // 替换为你的实际登录路由名称 ) {} public function onKernelRequest(RequestEvent $event): void { // 仅处理主请求 if (!$event->isMainRequest()) { return; } $request = $event->getRequest(); $token = $this->tokenStorage->getToken(); // 检测未认证用户的会话过期情况 if (!$token || !$token->getUser() instanceof \Symfony\Component\Security\Core\User\UserInterface) { try { // 尝试启动会话,触发过期校验 $session = $request->getSession(); $session->start(); } catch (SessionUnavailableException $e) { // 保存当前请求路径,登录后自动跳转回原页面 $this->saveTargetPath($request->getSession(), 'main', $request->getUri()); // 重定向至登录页 $event->setResponse(new RedirectResponse($this->router->generate($this->loginRoute))); } } } }
2. 关键配置说明
- 优先级设置:将监听器优先级设为
6,低于Symfony防火墙的默认优先级8,确保防火墙先完成认证状态校验,再处理会话过期逻辑。 - 登录路由替换:将
loginRoute参数值替换为你项目中实际的登录路由名称(比如security_login)。 - 跳转回原页面:通过
TargetPathTrait保存当前请求路径,若不需要此功能,可直接移除相关代码,仅保留重定向逻辑。
3. 验证效果
当用户会话过期后,访问任何需要认证的页面时,会自动捕获会话过期异常并重定向至登录页;若开启了原路径保存,用户登录成功后可直接回到之前访问的页面。
内容的提问来源于stack exchange,提问作者user18419618
相关产品推荐
相关产品推荐

