这个答案是参考 5.4 版本,可能是以前的版本,但我没有测试过。
问题的根源在于客户端的 CSRF 令牌已过期,这使得到服务器的任何 POST 都因该令牌而失败。
如果你使用 AJAX,你可以使用默认不做 CSRF 验证的 API 路由。
您可以关闭特定 URI 的 CSRF 验证。在这种情况下,我将关闭 /logout 的 CSRF 验证。如果您确实想从验证中排除某些 URI,这种方法很有效。
app/Http/Middleware/VerifyCsrfToken.php
/**
* 应该从 CSRF 验证中排除的 URI。
*
* @var 数组
*/
受保护的 $except = [
'/登出'
];
此外,您应该以适合您的应用程序的方式处理 CSRF 错误。下面是一个你可以做的非常基本的事情的例子。
app/Exceptions/Handler.php
/**
* 将异常渲染到 HTTP 响应中。
*
* @param \Illuminate\Http\Request $request
* @param \异常 $异常
* @return \Illuminate\Http\Response
*/
公共函数渲染($请求,异常$异常)
{
if($exception instanceof \Illuminate\Session\TokenMismatchException){
// 令牌不匹配是一个安全问题,请确保注销。
验证::注销();
// 告诉用户发生了什么。
session()->flash('alert-warning','您的会话已过期。请登录以继续。');
// 去登录。
返回重定向()->路由('登录');
}
返回父级::render($request, $exception);
}
顺便说一句,要测试这两个更改,您可以修改会话设置。我只是将生命周期设置为1 进行测试。然后,完成后将其重新设置(默认为 120)。您需要登录,加载表单页面,等待一分钟,然后尝试 POST。
配置/session.php
/*
|------------------------------------------------- -------------------------
|会话生命周期
|------------------------------------------------- -------------------------
|
|在这里您可以指定您希望会话的分钟数
|允许在到期前保持空闲状态。如果你想要他们
|要在浏览器关闭时立即过期,请设置该选项。
|
*/
'终生' => 1,