Introduce

使用Session代替Token进行前后端交互,可以正常使用Session功能且兼容Session所有驱动方式。只需要替换掉StartSession中间件即可。

Code

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Session\Session;
use Illuminate\Foundation\Http\Middleware\Concerns\ExcludesPaths;
use Illuminate\Http\Request;
use Illuminate\Session\Middleware\StartSession;
use Symfony\Component\HttpFoundation\Response;

class UseSessionIdMiddleware extends StartSession
{
    use ExcludesPaths;

    /**
     * 哪些地址不使用SESSION
     *
     * @var array|string[]
     */
    protected array $except = ['/'];

    protected string $sessionId = '';

    public function handle($request, Closure $next)
    {
        if ($this->inExceptArray($request)) {
            return $next($request);
        }
  
        $this->sessionId = $request->header('X-SESSION-ID', '');

        return tap(parent::handle($request, $next), function ($response) {
            $response->header('X-SESSION-ID', $this->manager->getId());
        });
    }

    public function getSession(Request $request)
    {
        return tap($this->manager->driver(), function ($session) use ($request) {
            $session->setId($this->sessionId);
        });
    }

    protected function addCookieToResponse(Response $response, Session $session)
    {
        //不响应SessionId到Cookie
    }
}
最后修改:2025 年 03 月 11 日
如果觉得我的文章对你有用,请随意赞赏