使用event.preventDefault时无法从laravel应用程序注销。另类?

时间:2018-01-13 20:04:55

标签: javascript php jquery forms laravel

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

    <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代码段发送这些表单:

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

我注意到,当此片段未被注释掉时,我无法从我的laravel应用程序注销。注销只是不起作用。

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

所以这是我退出的一部分:

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

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

这里的解决方法是什么?我如何在没有preventdefault方法的情况下发送这些表单?

或者我如何在使用时退出?我不想改变我的注销功能。

1 个答案:

答案 0 :(得分:1)

因此,要注销用户,您需要点击route('logout')这是一个预定义的路线,当您使用laravel auth系统时。

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

如果你进入隐藏在LoginController下的注销功能,你会看到一个特征(只是为了保持班级清洁)AuthenticatesUser Trait它负责注销用户。

AuthenticatesUser特质中,您将在第151行找到方法:

public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->invalidate();

    return redirect('/');
}

简单来说,它将用户从会话防护中记录下来(Guards定义了如何为每个请求对用户进行身份验证。)然后使用redir到主页销毁会话和用户注销的用户。

现在我们需要一个带有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>

具有a href的{​​{1}}标记,简单来说意味着阻止href标记执行它的正常行为。据说event.preventDefault()代码不会重定向到该路线,而是我们a href只需获取document.getElementById('logout-form').submit();">形式,并在用户点击logout-form时提交

或者只需更改&#39;下拉项目&#39;注销表单的类名,因为当两个表单都处于活动状态时会被冻结。