如何避免Laravel登录重定向到最新的AJAX调用?

时间:2018-06-07 18:34:02

标签: php ajax laravel redirect login

页面上发生了多个ajax请求,如果用户登录,则会通过以下代码段将用户重定向到最新的URL:

public function showLoginForm()
{
    if(!session()->has('url.intended')) {
        session(['url.intended' => url()->previous()]);
    }
    return view('auth.login');
}

此网址可能是ajax返回一些json。我如何避免想要的网址是ajax?我显然希望它重定向到实际的上一页而不是一些随机的ajax调用。通过将重定向网址保存为/login?redirect_uri=/go-here-after-login之类的查询参数来避免这种情况是唯一的方法吗?

另外,如果你有一个完全不同的方法,我会全力以赴。

谢谢!

1 个答案:

答案 0 :(得分:1)

您应该考虑将redirect()->intended()用于您的目的。

当未经身份验证的用户尝试访问受Auth中间件保护的页面时,他们会被重定向到您的登录页面,然后才会将他们想要的URL(他们尝试访问的URL)存储在会话中。

当该用户登录时,您可以使用redirect()->intended()将其重定向到目标网页或您选择的后备页面。例如:

class LoginController
{
    public function handleLogin()
    {
        if (Auth::attempt(request()->only(['email', 'password']))) {
            return redirect()->intended('/your/fallback/url');

            // Or if you want to get a URL by its route name:
            // return redirect()->intended(route('route.name'));
        }

        // Handle what happens if the user's credentials were incorrect
    }
}

据我所知,用户访问的每个网址(通过AJAX或其他方式)不应存储在会话中,只有当Auth中间件启动时才会存在预定的网址已设定。

在您的代码中,您使用url()->previous(),将用户重定向到引荐来源(发起请求的页面,即上一页),而不是存储的目标网址在会议中。