1.说明
问题发生在
js代码块中
jQuery调用post请求,访问Laravel的路由
问题日志
(1/1) TokenMismatchException
in VerifyCsrfToken.php (line 68)
at VerifyCsrfToken->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in ShareErrorsFromSession.php (line 49)
at ShareErrorsFromSession->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
问题的解释说明:
Laravel默认开启了 CSRF(Cross Site Request Forgery)(跨站伪装请求攻击)的保护开关。
所以,在使用post或者put等方法请求时,有时会报TokenMismatchException in VerifyCsrfToken.php line 67错误。
2.解决方案
方法一:将token值传递过去
第一步、表单提交时:
<form action="photo/12" method="post"> <?php echo method_field(‘PUT‘); ?> <?php echo csrf_field(); ?> <input type="submit" name="提交" /> </form>
第二步、使用AJAX请求时:
<meta name="csrf-token" content="{{ csrf_token() }}"> $.ajaxSetup({ headers: { ‘X-CSRF-TOKEN‘: $(‘meta[name="csrf-token"]‘).attr(‘content‘) } });
方法二:从 CSRF 保护中排除指定 URL
>
比如所访问的URL为http://laravel.com/photo/12,现在想排除关于photo资源的路由,则在
App\Http\Middleware\VerifyCsrfToken::class中添加路由如下:
protected $except = [ ‘photo‘, ‘photo/*‘, ];
注意,方法二将无法对photo相关路由进行CSRF防护,所以请根据实际情况选择。
参考资料:laravel中TokenMismatchException异常处理
3.我的考虑和方案选择
①我的最优先方案,是
直接jQuery传个 “_token” = “”{{ csrf_token() }}”” 过去。因为这样改动的代码最少。
后来发现,没有直接使用jQuery的现成方案,网上都是介绍ajax的。
②于是,我,想开始学ajax,但全部换用ajax,短期内代码改动的处数太多了。遂搁置ajax方案。
③最后的决定,是在 中间件Middleware\VerifyCsrfToken
里,添加过滤名单代码:
protected $except = [
//
'/todo/gto'//对该指定URL,关闭CSRF的保护机制。(防止post、put,出现500 Internal Server Error)
];
④OK。