假设我有一个使用auth中间件的页面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
答案 0 :(得分:5)
我的问题非常类似:Ajax Auth redirect on Laravel 5.6
正如@aimme(https://stackoverflow.com/users/1409707/aimme)所指出的,Ajax调用是无状态的,所以基本上你不能与后端进行交互。
他的建议和我的建议是将要重定向的目标网页传入网址,或者在您的情况下,您可以通过帖子参数传递给它,例如:
return response()->json([
'auth' => false,
'intended' => $request->intended,
'errors' => $validator->errors()
]);
答案 1 :(得分:3)
它可能对你有帮助
而不是这些return redirect()->intended(URL::route('dashboard'));
使用
return redirect('dashboard');
答案 2 :(得分:2)
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);
检查以上内容并为我工作正常,请检查您的代码。
答案 3 :(得分:1)
URL::previous();
此方法可帮助您获取以前的网址。你可以使用jQuery将用户重定向到那里:
window.location.href = url; // <- you can try your url here.
祝你好运!!
答案 4 :(得分:1)
首先,当你在后端收到请求时,保存redirect() - &gt; intention();
intention()检查会话索引url.intended是否存在 默认情况下重定向到它,或者重定向到$ default =&#39; /&#39;哪个行 被覆盖。
然后在请求成功时传递此URL,例如:
function testAjax(handleData) {
$.ajax({
url:"getvalue.php",
success:function(data) {
window.location.href = data.url;
}
});
}
答案 5 :(得分:1)
没有必要为AJAX调用做任何特别的事情。
在表单提交后,以与通常在后端相同的方式重定向。
return redirect()->route('dashboard');
在前端,您只需确保使用重定向的网址来更改window.location
。这将导致浏览器刷新并转到新页面。
axios.post(url, formData).then(response => {
window.location = response.request.responseURL;
});
此代码段适用于流行的Axios库,但使用jQuery或vanilla JavaScript可以完成相同的操作。
答案 6 :(得分:1)
如果我正确理解您的问题,则问题是,当您尝试提供目标网址时,您会混淆之前的网址在JSON响应中重定向到的URL。 之前的网址实际上是指HTTP Referrer,而不是目标网址,该网址是由Laravel的auth中间件在会话中设置的。
HTTP referrer是发起请求的页面。如果您当前位于/foo
页面,并且点击了指向/bar
页面的链接,则/bar
上的HTTP推荐人将为/foo
。当你发起一个AJAX请求时会发生同样的事情,你所在的页面将成为你正在击中的终点的引用者。在您的情况下,您的登录页面将通过AJAX向您的登录处理程序发起请求。
当您尝试访问受Laravel的auth middleare保护的页面时,Laravel会在此时为会话中的预期 URL设置值,然后重定向到登录名页。 Laravel将预期的 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
抓取目标网址:
$redirect = redirect()->intended(URL::route('dashboard'))
if ($request->ajax()) {
return response()->json([
'auth' => $auth,
'intended' => $redirect->getTargetUrl(),
'errors' => $errors
]);
}
return $redirect;
答案 7 :(得分:0)
我通过以包含url()-> previous()值的形式制作一个隐藏字段来解决此问题,因为没有其他方法可以获取上一页,即页面A网址。我几乎尝试了以上所有答案。