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

Laravel:通过Request::create以POST调用控制器并避免会话过期

问题分析与解决方案

核心问题

你通过WebSocket调用Laravel控制器时,虽传递了Cookie和CSRF令牌仍触发会话过期,本质是会话上下文未正确构建,Laravel无法识别WebSocket请求中的会话标识,无法关联到用户有效会话。

具体修复步骤

1. 确保会话Cookie被Laravel正确识别

Laravel的会话依赖{session_name}_session Cookie(你的是suplifalcon_session)识别会话,需确保该Cookie值正确传递,且Laravel能从请求头中读取到会话标识(会话系统优先读取请求头的Cookie,而非Request构造器的$cookies参数)。

修改call方法,补充服务器环境变量模拟HTTP请求头:

public function call($ruta, $parametros, $cookies) {
    // 构建Cookie请求头字符串
    $cookieHeader = '';
    foreach ($cookies as $name => $value) {
        $cookieHeader .= "$name=$value; ";
    }
    $cookieHeader = rtrim($cookieHeader, '; ');

    // 补充服务器环境变量,传递Cookie和XSRF令牌头
    $server = [
        'HTTP_COOKIE' => $cookieHeader,
        'HTTP_X-XSRF-TOKEN' => $cookies['XSRF-TOKEN'] ?? '',
    ];

    $req = Request::create($ruta, "post", $parametros, [], [], $server);
    $res = app()->handle($req);
    $respu = $res->getContent();

    return $respu;
}

2. 修正CSRF令牌的传递逻辑

Laravel的CSRF验证要求POST请求的_token参数(或X-XSRF-TOKEN请求头)与会话中的XSRF-TOKEN匹配,调整调用代码:

$respu = $callController->call(
    $datos['ruta'],
    ['_token' => $datos['_token']], // POST参数中传递_token
    [
        'XSRF-TOKEN' => $datos['XSRF-TOKEN'],
        'suplifalcon_session' => $datos['suplifalcon_session']
    ]
);

3. 校验会话驱动与环境权限

  • 若使用file会话驱动,需确保WebSocket服务器进程有读写storage/framework/sessions目录的权限,否则无法读取会话文件导致过期判定。
  • 分布式部署场景(WebSocket与Web服务器分离),建议改用redis或database会话驱动,确保会话数据跨进程共享。

4. 临时排查:跳过目标路由的CSRF验证

若上述方法无效,可临时将WebSocket调用的目标路由加入CSRF白名单,排查是否为CSRF验证导致:
在app/Http/Middleware/VerifyCsrfToken.php中添加路由:

protected $except = [
    // 替换为你的目标路由规则
    'your-target-route/*',
];

注意:此为临时排查方案,生产环境需确保请求来源安全后再考虑是否保留。


内容的提问来源于stack exchange,提问作者IvanJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:30:53