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

Laravel 10:如何在中间件中将请求方法从GET改为POST?

Laravel CAS认证后POST请求恢复方案
  • 第一步:存储POST请求上下文到Session
    在执行CAS认证检查前,拦截POST请求并把关键信息存入Session,防止跳转后数据丢失:
public function handle(Request $request, Closure $next)
{
    // 仅在未存储过POST数据时执行,避免重复存储
    if ($request->isMethod('POST') && !$request->session()->has('post_redirect_cache')) {
        $request->session()->put('post_redirect_cache', [
            'method' => $request->method(),
            'full_url' => $request->fullUrl(),
            'input' => $request->all(),
        ]);
    }

    // 执行CAS认证检查
    if (!cas()->checkAuthentication()) {
        return cas()->authenticate();
    }

    return $next($request);
}
  • 第二步:认证完成后恢复POST请求
    从CAS服务器跳转回应用时,检查Session中是否有存储的POST上下文,若有则修改当前请求的方法和输入数据:
public function handle(Request $request, Closure $next)
{
    // 先处理POST请求恢复
    if ($cache = $request->session()->pull('post_redirect_cache')) {
        // 修改请求方法为原POST
        $request->setMethod($cache['method']);
        // 合并原POST数据到当前请求
        $request->merge($cache['input']);
        // 重置请求URI以匹配原路由
        $request->server->set('REQUEST_URI', parse_url($cache['full_url'], PHP_URL_PATH));
    }

    // 执行CAS认证检查(未提前执行时)
    if (!cas()->checkAuthentication()) {
        return cas()->authenticate();
    }

    return $next($request);
}
  • 注意事项
    • 中间件顺序:若拆分两个中间件,需先执行POST恢复逻辑,再执行CAS认证;若整合在一个中间件里,要先检查恢复请求,未认证时先存POST数据再跳转CAS。
    • 防重复提交:pull方法会自动移除Session中的缓存,若出现异常,可在控制器逻辑完成后手动清理,或给表单添加唯一token验证。
    • 路由匹配:重置REQUEST_URI是为了让Laravel路由系统正确匹配原POST路由,避免跳转后因路由不匹配出现404。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:22:34