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
相关产品推荐
相关产品推荐

