【问题标题】:Unable to logout from Laravel application when using event.preventDefault. Alternative?使用 event.preventDefault 时无法从 Laravel 应用程序中注销。选择?
【发布时间】:2018-06-22 22:52:00
【问题描述】:

所以我的应用程序中的几个表单看起来像这样:

<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
    {!! Form::open(['action'=>['AdminController@update',$upload->id,0], 'method'=>'POST']) !!}
    {{Form::hidden('_method','PUT')}}
    <a class="dropdown-item" href="/manage">Approve</a>
    {!! Form::close()!!}

    {!! Form::open(['action'=>['AdminController@update',$upload->id,1], 'method'=>'POST']) !!}
    {{Form::hidden('_method','PUT')}}
    <a class="dropdown-item" href="/manage">Reject</a>
    {!! Form::close()!!}

</div>

我正在使用以下 jQuery sn-p 发送这些表单:

$(".dropdown-item").click(function(e){
    e.preventDefault();
    $(this).closest("form").submit();
});

我注意到当这个 sn-p 没有被注释掉时,我无法从我的 Laravel 应用程序中注销。登出是行不通的。

我正在使用标准的 Laravel 身份验证。

这是我退出的一部分:

<a class="dropdown-item" href="#" onclick="window.location='{{ route('logout') }}'">Log out</a>

首先,有人能解释一下为什么会这样吗?我试图调查,但我读到的内容没有多大意义,因为我对这一切都是新手。

这里的解决方法是什么?如果没有preventdefault 方法,我如何发送这些表格?或者如何在使用时注销?我不想更改我的注销功能。

【问题讨论】:

    标签: javascript php jquery forms laravel


    【解决方案1】:

    所以要注销用户,你需要点击route('logout'),这是你搭建 laravel auth 系统时预定义的路由。

    它在/src/Illuminate/Routing/Router.php 1125 行下定义的注销路由。它需要是一个发布请求才能注销用户,除了 laravel csrf 令牌之外不需要发送任何必需的参数,这是确保请求来自应用程序本身,而不是任何外部脚本。

    如果您转到隐藏在LoginController 下的注销功能,您将看到一个特征(只是为了保持类更清洁)AuthenticatesUser 特征它负责注销用户。

    AuthenticatesUser trait 中,你会在第 151 行找到一个方法:

    public function logout(Request $request)
    {
        $this->guard()->logout();
    
        $request->session()->invalidate();
    
        return redirect('/');
    }
    

    简单来说,它将用户从会话保护中注销(保护定义了如何为每个请求对用户进行身份验证。)然后销毁会话,并且用户通过重定向到主页注销。

    现在我们需要一个带有 csrf 令牌的发布请求来注销用户:

        <a href="{{ route('logout') }}"
          onclick="event.preventDefault();       
    
           document.getElementById('logout-form').submit();">
           Logout
       </a>
    

    表单放在a href标签下

     <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
         {{ csrf_field() }}
     </form>
    

    具有event.preventDefault()a href 标记简单来说意味着阻止href 标记以正常方式运行。话虽如此,a href 标签不会重定向到路由,而是我们有 document.getElementById('logout-form').submit();"&gt;,它只是获取表单 logout-form 并在用户单击该 a href tag 时提交它

    或者简单地更改注销表单的“下拉项目”类名,因为当两个表单都处于活动状态时,prolly 会被冻结。

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 2016-09-03
      • 1970-01-01
      • 2018-03-22
      • 2011-08-28
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多