我正在使用laravel 5.4。我需要处理一些错误。 想象用户登录并打开两个窗口(他的个人资料)。当用户在窗口中单击注销时,我们仍然在另一个窗口中注销按钮,通过单击它,laravel将显示csrf_token错误页面。
我的注销不是ajax,而是向/logout
提交表单
如何使用特殊消息处理此错误或重定向到主页而无需退出控制器的错误? (并非所有csrf_token
错误,仅来自该控制器)。
退出表格:
我将使用jquery:
点击退出按钮提交此表单<form id="logout-form" action="/logout" method="POST" style="display: none;">
<input type="hidden" name="_token" :value="token">
</form>
控制器中的注销方法:
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->flush();
$request->session()->regenerate();
return redirect('/');
}
答案 0 :(得分:2)
使用新的有效 CSRF 令牌将用户返回到表单,这样页面就会刷新,并且注销按钮将不存在。
public function render($request, Exception $exception)
{
if($exception instanceof TokenMismatchException)
{
return redirect()
->back()
->with('your msg');
}
return parent::render($request, $exception);
}
看起来,页面刷新。
不要用Get替换POST。它不会安全和标准。
答案 1 :(得分:1)
一种方法是使用GET
进行注销。实际上使用简单的<a href="/logout">logout</a>
就足够了。所以你改变了使用get的路线,然后你可以向表格挥手。
尽管可能对使用的方法有不同的看法,但实际上,这已经足够了。
<强>更新强>
是不是像我说的那样管理错误?
在我看来,这是我现在要做的最好的事情。否则,当有人尝试注销路线时显示特殊消息,即使他们已注销,我将只执行以下操作:
public function logout(Request $request)
{
if (!auth()->check()) {
return redirect('/')->with('login_error', 'You are already logged out please login again'); // message can be retrieved in session()
}
$this->guard()->logout();
$request->session()->flush();
$request->session()->regenerate();
return redirect('/');
}
我仍然不会使用post,因为我没有创建任何资源。
我希望这会有所帮助。