Laravel Ajax登录,成功后重定向到上一个网址

时间:2018-06-11 09:50:38

标签: ajax laravel login laravel-5.4

假设我有一个使用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

8 个答案:

答案 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网址。我几乎尝试了以上所有答案。