Laravel如何捕获419然后重定向到不同的登录页面

mgdq6dx1  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(224)

我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');
            }
        };
    });
}
syqv5f0l

syqv5f0l1#

renderable回调中尝试TokenMismatchException错误,如下所示

$this->renderable(function (TokenMismatchException $e, $request) {
    $segments = $request->segments();
    if(isset($segments[1]) && $segments[1] == 'admin'){
        return redirect()->route('admin.login');
    }else{
        return redirect()->route('login');
    }
});

相关问题