【问题标题】:how to manage a special error with special message in laravel如何在 laravel 中使用特殊消息管理特殊错误
【发布时间】:2023-03-26 03:07:01
【问题描述】:

我正在使用 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('/');
}

【问题讨论】:

  • 我也参与了这个问题。

标签: php laravel laravel-5 error-handling laravel-5.4


【解决方案1】:

App\Exceptions\Handler.php 中 使用新的有效 CSRF 令牌将用户返回到表单,因此页面将刷新并且注销按钮将不存在。

public function render($request, Exception $exception)
{ 
   if($exception instanceof TokenMismatchException)
   { 
      return redirect()
               ->back()
               ->with('your msg');
   }
   return parent::render($request, $exception); 
}

看起来,页面已刷新

不要将 POST 替换为 Get。它不会安全和标准。

【讨论】:

  • 我曾经用重定向处理这类问题,但这个答案给出了“正确的方法”
【解决方案2】:

一种方法是使用GET 注销。实际上使用简单的&lt;a href="/logout"&gt;logout&lt;/a&gt; 应该就足够了。因此,您将路线更改为使用 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('/');
}

我仍然不会使用帖子,因为我没有创建任何资源。

我希望这会有所帮助。

【讨论】:

  • 有办法做到这一点,但这是我现在能想到的最好的方法。也许您应该简单地将您的表单方法更改为GET,然后将您的路由中的方法也更改为GET,从表单中删除令牌字段,然后您不需要使用我建议的&lt;a href...
  • 优点是,您不必担心它会显示任何错误,如果您想在这种情况下自定义注销消息,那么它很容易。所以在你的控制器之前,检查if(!auth()-&gt;check()){ do something since you are already logged out }否则只是注销。
  • 你改成 GET 了吗?
  • 哦,是的。得到它的工作。为什么 laravel 使用该帖子? post方法在这个问题上更安全吗???
  • 嗯,从这个意义上说,Post 更安全,因为它要求您必须先登录并拥有 ('csrf_token') 才能运行该路线,这样您才能确定该人访问该路线的是登录用户,而不是其他人。但是,在注销的情况下,我认为这不是问题,尤其是在处理这种情况时。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多