Laravel Ajax登录,成功后重定向到上一个url
Posted
技术标签:
【中文标题】Laravel Ajax登录,成功后重定向到上一个url【英文标题】:Laravel Ajax login, redirect to previous url after success 【发布时间】:2018-11-20 12:52:37 【问题描述】:假设我有一个页面 A 正在使用身份验证中间件。由于没有登录,它被重定向到登录页面。
在登录页面上,我有自定义的 ajax 登录系统。成功登录后,我想重定向到具有相同 url 的页面 A,以便可以完成操作。
我的登录代码是这样的:
public function postLogin(Request $request)
$auth = false;
$errors = [];
$inputs = $request->all();
$validator = $this->validator($inputs);
if ($validator->fails())
return response()->json([
'auth' => false,
'intended' => URL::previous(),
'errors' => $validator->errors()
]);
$user = User::where('email', $request->get('email'))->first();
if ($user && $user->is_active == 0)
$errors[] = "This account has been deactivated";
else if ($user && $user->confirm_token != null)
$errors[] = "Please verify your email in order to login";
else
$credentials = ['email' => $request->get('email'), 'password' => $request->get('password'), 'is_active' => 1];
if (Auth::attempt($credentials, $request->has('remember')))
$auth = true;
else
$errors[] = "Email/Password combination not correct";
if ($request->ajax())
return response()->json([
'auth' => $auth,
'intended' => URL::previous(),
'errors' => $errors
]);
return redirect()->intended(URL::route('dashboard'));
我试图通过 url()->previous() 获取以前的 url,但它返回登录页面 url。有人可以指导我吗?任何改进/帮助将不胜感激。
我正在使用 Laravel 5.4
【问题讨论】:
Idk 如果我的方式是正确的,但我这样做完全不同。我不使用 ajax() 我只是在没有 ajax 的帖子上传递值并返回错误或重定向... 使用 back() 并将其作为文本传递 您的问题解决了吗? 用会话来做。每当登录中间件拒绝访问时,您都可以使用某个密钥将其置于会话中。并且每当用户成功登录时重定向到该路由并清除会话。 【参考方案1】:我这里有一个非常相似的问题:Ajax Auth redirect on Laravel 5.6
正如@aimme (https://***.com/users/1409707/aimme) 指出的,Ajax 调用是无状态的,所以基本上你不能与后端交互。
他的建议和我的建议是传递要重定向到的预期页面的 URL,或者在您的情况下,您可以通过 post 参数传递给它,例如:
return response()->json([
'auth' => false,
'intended' => $request->intended,
'errors' => $validator->errors()
]);
【讨论】:
【参考方案2】:也许对你有帮助
而不是这些return redirect()->intended(URL::route('dashboard'));
使用
return redirect('dashboard');
【讨论】:
我说的是AJAX请求部分 他需要根据自己所处的位置动态设置页面。【参考方案3】:对于 AJAX 调用,不需要做任何特别的事情。
在提交表单后,以与通常在后端相同的方式重定向。
return redirect()->route('dashboard');
在前端,您只需要确保使用重定向的 URL 来更改 window.location
。这将导致浏览器刷新并转到新页面。
axios.post(url, formData).then(response =>
window.location = response.request.responseURL;
);
这段代码 sn-p 用于流行的 Axios 库,但同样的事情可以用 jQuery 或 vanilla javascript 完成。
【讨论】:
【参考方案4】:如果我正确理解了您的问题,那么问题是您在尝试提供要重定向的 URL 时混淆了 previous URL 与 intended URL在您的 JSON 响应中。 previous URL 实际上是指HTTP Referrer,而不是预期的 URL,它是由 Laravel 的 auth 中间件在会话中设置的。
HTTP 引荐来源网址是发起请求的页面。如果您当前在页面 /foo
上并单击指向页面 /bar
的链接,则 /bar
上的 HTTP 引荐来源网址将是 /foo
。当您发起 AJAX 请求时也会发生同样的事情,您所在的页面将成为您正在访问的端点的引用者。在您的情况下,您的登录页面正在通过 AJAX 向您的登录处理程序发起请求。
当您尝试访问受 Laravel 的 auth middleare 保护的页面时,Laravel 会在该点为会话中的 intended URL 设置一个值,然后将您重定向到登录页面。 Laravel 将会话中的 intended URL 存储为 url.intended
(正如您将能够在 Illuminate\Routing\Redirector::intended
中看到的那样,这是 redirect()->intended()
调用的内容)。所以你需要做的就是从会话中获取它。
if ($request->ajax())
return response()->json([
'auth' => $auth,
'intended' => session()->pull('url.intended') ?: URL::route('dashboard'),
'errors' => $errors
]);
return redirect()->intended(URL::route('dashboard'));
注意:使用->pull
将在检索项目后将其从会话中删除。
更简单的方法是从预期的RedirectResponse
中获取目标 URL:
$redirect = redirect()->intended(URL::route('dashboard'))
if ($request->ajax())
return response()->json([
'auth' => $auth,
'intended' => $redirect->getTargetUrl(),
'errors' => $errors
]);
return $redirect;
【讨论】:
【参考方案5】:Laravel 5.4 + 支持。不知道低版本
return redirect()->back();
这将重定向到您之前的页面。
Ajax 部分
<script type="text/javascript">
var url = "<?php echo url()->previous(); ?>";
location.href = url;
</script>
OR simply javascript function
history.go(-1);
检查以上内容并为我工作正常请检查您的代码。
【讨论】:
【参考方案6】:URL::previous();
此方法将帮助您获取以前的 URL。您可以使用 jQuery 将用户重定向到那里:
window.location.href = url; // <- you can try your url here.
祝你好运!!
【讨论】:
他在帖子中说 URL::previous();不为他工作。用于重定向的 jquery 代码有效,但您的示例中未定义 url。阅读此答案后,尚不清楚他应该做什么。【参考方案7】:首先当你在后端收到请求时保存redirect()->intended();
intended() 检查会话索引 url.intended 是否存在并且 默认重定向到它,否则重定向到 $default='/' 可以 被覆盖。
然后在请求成功时传递这个URL,例如:
function testAjax(handleData)
$.ajax(
url:"getvalue.php",
success:function(data)
window.location.href = data.url;
);
【讨论】:
【参考方案8】:我通过在包含 url()->previous() 值的表单中创建一个隐藏字段来解决它,因为没有其他方法可以获取上一页,即 Page A url。我几乎尝试了所有上述答案。
【讨论】:
以上是关于Laravel Ajax登录,成功后重定向到上一个url的主要内容,如果未能解决你的问题,请参考以下文章