laravel 5.4 使用 ajax 登录。身份验证成功,但 redirectTo 属性不起作用并保持重定向到“/home”

Posted

技术标签:

【中文标题】laravel 5.4 使用 ajax 登录。身份验证成功,但 redirectTo 属性不起作用并保持重定向到“/home”【英文标题】:laravel 5.4 login using ajax. Authentication succeeded but redirectTo property not working and keep redirect to '/home' 【发布时间】:2018-02-18 23:11:43 【问题描述】:

我正在尝试在 laravel 中使用 ajax 创建自定义登录,因此我认为表单验证错误会显示得更快。我已经成功显示表单验证错误,在凭据为假时显示消息,并在凭据为真时重新加载登录页面。我的问题是当登录页面重新加载时,它仍然将页面重定向到'/home'页面,但是我已经将redirectTo属性设置为'/'。

这是我的登录控制器

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

use Illuminate\Http\Request;
use Validator;

class LoginController extends Controller

/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/

use AuthenticatesUsers;

/**
 * Where to redirect users after login.
 *
 * @var string
 */
protected $redirectTo = '/';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()

    $this->middleware('guest')->except('logout');

public function showLoginForm()
  return view('auth.loginjax');

public function username()

    return 'username';

public function login(Request $request)
  if ($this->hasTooManyLoginAttempts($request)) 
    $this->fireLockoutEvent($request);

    return $this->sendLockoutResponse($request);
  
  $validator = Validator::make($request->all(),[
    $this->username() => 'required|string',
    'password' => 'required|string',
  ]);
  $data = array();
  if ($validator->passes()) 
    $data['valid']=true;
    if ($this->attemptLogin($request)) 
      // return $this->sendLoginResponse($request);
      $data['masuk'] = true;
    else 
      $this->incrementLoginAttempts($request);
      // return $this->sendFailedLoginResponse($request);
      $data['masuk'] = false;
    
  else 
    $data['namafield']=array();
    $data['texterror']=array();
    $data['valid']=false;
    if ($validator->errors()->has($this->username())) 
      $data['namafield'][]=$this->username();
      $data['texterror'][]=$validator->errors()->first($this->username());
    
    if ($validator->errors()->has('password')) 
      $data['namafield'][]='password';
      $data['texterror'][]=$validator->errors()->first('password');
    
  
  return response()->json($data);
 

当我在没有 ajax 且没有覆盖登录方法的情况下登录时,我的登录控制器工作正常(重定向到“/”页面)。

这是我的ajax方法

function masuk()
  loadingSuccess("#alert_login");
  $('#btnMasuk').val('Konfirmasi..');
  $("#btnMasuk").attr("disabled",true);
  $.ajax(
    url:" route('masuk') ",
    type: "POST",
    data: $('#formLogin').serialize(),
    dataType:"JSON",
    success:function(data)
      $("#alert_login").html('');
      $("button").attr("disabled",false);
      if (data.valid) 
        if (data.masuk===true) 
          location.reload()
        else 
          var div = "#alert_login";
          var message = "Kombinasi Nama Pengguna dan Kata Sandi Tidak Ditemukan";
          $('#username').focus();
          alertDanger(div,message);
        
      else
        for (var i = data.namafield.length; i >= 0; i--)
        
          $('[name="'+data.namafield[i]+'"]').focus();
          $('[name="'+data.namafield[i]+'"]').parent().addClass('has-error'); //select parent twice to select div form-group class and add has-error class
          $('[name="'+data.namafield[i]+'"]').next().text(data.texterror[i]);
        
      
      $('#btnMasuk').val('Masuk');
      $("#btnMasuk").attr("disabled",false);
    ,
    error: function (data)
    
      alert(data);
    
  )

如您所见,我使用 location.reload() 重新加载页面。

如果你知道些什么,请告诉我,对不起我的英语不好。

【问题讨论】:

【参考方案1】:

这不起作用,因为 LoginController 只是返回登录后应该重定向的页面的 html,如果您看到成功关闭 ajax 的结果,您将看到 html。所以基本上你要做的是当 ajax 请求成功时,即httpStatusCode == 200 然后你必须在 JS 的帮助下手动将用户重定向到你想要的页面。

window.href = '/home';

【讨论】:

是的,我想我会按照你的建议去做。谢谢!

以上是关于laravel 5.4 使用 ajax 登录。身份验证成功,但 redirectTo 属性不起作用并保持重定向到“/home”的主要内容,如果未能解决你的问题,请参考以下文章

如果用户未使用中间件进行身份验证,Laravel 5.4 将重定向到特定页面

Laravel 5.4 登录后重定向到自定义 url

Laravel 5.4 Auth Guardian 驱动程序 [customers] 未定义

laravel 5.4,添加二次认证(管理面板)

使用Laravel 5.4请求Ajax

无法使用 $request->ajax() 和 Laravel 5.4 检查请求是不是为 ajax