簡體   English   中英

使用 event.preventDefault 時無法從 Laravel 應用程序注銷。 替代?

[英]Unable to logout from Laravel application when using event.preventDefault. Alternative?

所以我的應用程序中有幾個表單看起來像這樣:

<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方法的情況下發送這些表單? 或者我如何在使用它時注銷? 我不想更改我的注銷功能。

因此,要注銷用戶,您需要點擊route('logout') ,這是在搭建 laravel 身份驗證系統時的預定義路由。

注銷路由定義在/src/Illuminate/Routing/Router.php行 1125 下。它需要是一個 post 請求才能注銷用戶,除了 laravel csrf 令牌之外,沒有需要發送的參數,這是令牌確保請求來自應用程序本身而不是任何外部腳本。

如果您轉到隱藏在LoginController下的注銷功能,您將看到一個特征(只是為了保持類清潔) AuthenticatesUser Trait 它負責注銷用戶。

AuthenticatesUser 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標簽下的表單

 <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();">它只是獲取表單logout-form並在用戶點擊它時提交它a href tag

或者簡單地更改注銷表單的“下拉項”類名稱,因為當兩個表單都處於活動狀態時,它會被凍結。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM