我Google了很多。大多数帖子都说,设置csrf
1 meta标签,名称=“csrf-token”,内容="{{ csrf_token()}}”
2@csrf在表单标记内
③排除路线
另一个变通方案,延长时间。
Route::get('refresh-token', function(){
return csrf_token();
});
然后使用javascript write setInterval来获取新的csrf...
这些我已经做了。但我想要更好更简单的解决方案:
如果出现419,请跳转到登录页面。
首页http://mysite/login
管理员登录http://mysite/admin/login
如何捕获419和当前部分(管理员或不),然后重定向??
ChatGPT告诉我使用App\Exceptions\Handler。它说render(),但laravel 10中有register()。我认为函数内部的代码是相同的。
它用途:
public function render($request, Exception $exception)
我的laravel是
public function register()
我改成
public function register(Request $request)
上面写着
'App\Exceptions\Handler::register()' is not compatible with method 'Illuminate\Foundation\Exceptions\Handler::register()
我用
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
$request = new Request;
$segment = $request->segment();
echo '<pre>', print_r($segment, 1), "</pre>"; exit;
$this->renderable(function (\Exception $e) {
if ($e->getPrevious() instanceof \Illuminate\Session\TokenMismatchException) {
return redirect()->route('lang.admin.login');
};
});
}
它给予了我白色页。
我想我找到解决办法了。在renderable()中添加$request:
public function register(){ $this->reportable(function(Throwable $e){ // });
$this->renderable(function (\Exception $e, $request) {
$segments = $request->segments();
if ($e->getPrevious() instanceof \Illuminate\Session\TokenMismatchException) {
if($segments[1] == 'admin'){
return redirect()->route('admin.login');
}else{
return redirect()->route('login');
}
};
});
}
1条答案
按热度按时间syqv5f0l1#
在
renderable
回调中尝试TokenMismatchException
错误,如下所示