页面上发生了多个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
之类的查询参数来避免这种情况是唯一的方法吗?
另外,如果你有一个完全不同的方法,我会全力以赴。
谢谢!
答案 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()
,将用户重定向到引荐来源(发起请求的页面,即上一页),而不是存储的目标网址在会议中。