You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:50:10