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的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中登录后重定向特定页面

在 Laravel 5 中进行身份验证后重定向

登录成功后重定向到新页面

登录laravel 5.7后重定向到上一页

Laravel - 登录后重定向回登录页面

在 Laravel 中登录多个角色后重定向