2017-07-27 23 views
0

我正在使用laravel 5.4。我需要处理一些错误。 想象用户登录并打开两个窗口(他的个人资料)。当用户在窗口中单击注销时,我们仍然在另一个窗口中注销按钮,并且通过单击该按钮,laravel将显示csrf_token错误页面。如何管理laravel中特殊错误的特殊错误

我不注册ajax并将其提交到/logout 我怎样才能处理这个错误与特殊消息或重定向到家没有错误退出控制器? (不是所有的csrf_token错误,只是从该控制器)。

注销表单:

<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('/'); 
} 
+1

**我也参与了这个问题。** –

回答

1

应用程序\例外\ Handler.php 返回用户的形式与新的有效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

一种方法是使用GET

我会通过点击退出按钮使用jQuery提交此表为您的注销。实际上使用简单的<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('/'); 
} 

我仍然无法使用后,由于我没有创造任何资源。

我希望这会有所帮助。

+0

没有任何方法可以像我说的那样管理错误吗? –

+1

可能有办法做到这一点,但这是我现在能想到的最好的。也许你应该简单地改变你的表单方法到GET,然后改变你的路由中的方法以及GET,从表单中删除标记字段,然后你不需要使用'

+1

好处是,你不必担心它会显示任何错误,如果你想在这种情况下定制你的注销消息,那么它很容易。因此,在你的控制器之前,请检查'if(!auth() - > check()){做一些事情,因为你已经注销}否则只是注销。 –