gpt4 book ai didi

javascript - session 过期时如何处理 laravel TokenMismatchException

转载 作者:搜寻专家 更新时间:2023-10-31 21:26:22 26 4
gpt4 key购买 nike

当 session 过期时,用户无法在不刷新页面的情况下重新登录,因为 ajax header 中的 _token 已过期(又名 TokenMismatchException)。我无法通过将用户重定向到登录页面来处理异常,因为登录是覆盖模式并且请求是通过 ajax 处理的。

我想我可以在 Handler.php 中捕获不匹配异常并返回带有 session token 的 json 响应。在客户端,使用新 token 继续预期的过程。但是,当我使用从服务器传递的新 token 时, session token 将在服务器端再次更改,从而导致另一个 TokenMismatchException

那么我应该如何在不刷新页面的情况下以安全的方式处理异常?

这是我现在拥有的:

在全局 js 文件中设置 csrf_token:

   $(function () {
$.ajaxSetup({
headers: { 'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content') }
});
});

app/exceptions/handler.php 中的渲染方法:

  public function render($request, Exception $e)
{
if ($this->isHttpException($e))
{
return $this->renderHttpException($e);
}
else if ($e instanceof TokenMismatchException)
{
if ($request->ajax()) {
return response()->json([
'message' => 'TokenMismatchException',
'token' => csrf_token()
]);
}
}
else
{
return parent::render($request, $e);
}
}

在 authentication.js 中:

  $.ajax({
type: "POST",
url: "/auth/login",
data: {
"email" : $('#login_email').val(),
"password" : $('#login_password').val(),
'remember': $('#login_remember').is(':checked')
},
success: function(response) {
if (response.message === 'TokenMismatchException') {
console.log(response); //message and token exist
//if catch the exception, use the new token to set up the ajax headers and login again

$.ajaxSettings.headers["X-CSRF-TOKEN"] = response.token;
console.log($.ajaxSettings.headers["X-CSRF-TOKEN"]);
$.ajax({
type: "POST",
url: "/auth/login",
data: {
"email" : $('#login_email').val(),
"password" : $('#login_password').val(),
'remember': $('#login_remember').is(':checked'),
},
success: function(res) {
console.log(res);

},
error: function(err) {
console.log(err);
}
});

}
console.log('logged in');
},
error: function(xhr, status, err) {
}
});

提前致谢。

最佳答案

在您的渲染函数中,您必须检查特定的 TokenMismatchException。所以也许你可以尝试这样的事情:

   if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
return response()->json('msg', 'Your session has expired. Please try again.');
}

您还可以将新的 csrf_token 与 json 一起传递,以便您可以将旧的替换为新的并再次发送表单请求。

if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
return response()->json(['msg'=> 'Your session has expired. Please try again.', 'token'=> csrf_token()]);
}

我还没有测试过这段代码。但这应该让你开始。

另外,如果你愿意,你可以使用一个包:https://github.com/GeneaLabs/laravel-caffeine

关于javascript - session 过期时如何处理 laravel TokenMismatchException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35353476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com