Javascript 使用event.preventDefault时无法从Laravel应用程序注销。可供替代的
因此,我在申请表中添加了两个表单,如下所示:Javascript 使用event.preventDefault时无法从Laravel应用程序注销。可供替代的,javascript,php,jquery,forms,laravel,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 clas
<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>
我注意到,当这段代码没有被注释掉时,我无法从我的Laravel应用程序中注销。注销根本不起作用
我使用的是标准的Laravel身份验证
这是我如何注销的一部分:
<a class="dropdown-item" href="#" onclick="window.location='{{ route('logout') }}'">Log out</a>
首先,有人能解释为什么会发生这种情况吗?我试着去调查,但我读到的没有多大意义,因为我对这一切都是新手
这里的解决办法是什么?如果没有
preventdefault
方法,我如何发送这些表单?或者在使用时如何注销?我不希望更改我的注销功能。因此,要注销用户,您需要点击路由(“注销”)
,这是在您创建laravel auth系统时预定义的路由
注销路由在/src/illighte/Routing/Router.php
第1125行中定义。它需要是post请求才能注销用户,除laravel csrf令牌外,没有需要发送的参数,该令牌用于确保请求来自应用程序本身,而不是任何外部脚本
如果您转到隐藏在LoginController
下的注销函数,您将看到一个trait(只是为了保持类更干净)authenticateUser
trait,它负责注销用户
在authenticateUser
trait中,您将在第151行找到一个方法:
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return redirect('/');
}
简单来说,它会将用户从会话保护中注销(保护定义了如何对每个请求对用户进行身份验证),然后销毁会话,并通过重拨将用户注销到主页
现在,如前所述,我们需要一个带有csrf令牌的post请求来注销用户:
<a href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
a href
标记包含event.preventDefault()
,简单地说就是阻止a href标记正常工作。也就是说,a href
标记不会重定向到路由,而是我们有document.getElementById('logout-form').submit();“>
它只需获取表单注销表单
,并在用户单击该a href标签时提交该表单
或者简单地更改注销表单的“dropdown item”类名,因为当两个表单都处于活动状态时,该类名将被冻结
<a href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>