我在堆栈 laravel 8/jetstream/inertiajs 中注销时出错 您的表单发布表单POST的最佳方式

问题描述

我正在尝试设置注销路线。

我发现了很多刀片语法(like that),但没有使用 vuejs。因此,我尝试通过插入一个带有 csrf 标记值且名称设置为“_token”的输入来复制刀片语法的结果。 (csrf 变量包含位于 XSRF-TOKEN cookie 中的字符串)。

当我发帖时,控制台中出现此错误: POST http://localhost:3000/注销419(状态未知)

你能告诉我我的错误在哪里吗?如何正确注销并重定向到我选择的页面

<form method="POST" :action="$route('logout')">
   <input type="hidden" name="_token" :value="csrf">
   <button type="submit">logout</button>
</form>

解决方法

我找到了解决方案。

我的错误在于恢复不好的 csrf 令牌。 我将检索包含在 XSRF-TOKEN cookie 中的长字符串,而我必须从我的后端接收令牌。这两个字符串完全不同,出于某种我还不知道的原因。

我只需要使用 csrf_token() 方法将 csrf 令牌发送到我的前端

return Inertia::render('Dashboard',[
   'publications' => $publications,'users' => $users,'csrf_token' => csrf_token()
]);

我也不需要手动填写表格

最后,我能够获取令牌作为道具并将其包含在我的帖子请求中,如下所示:

this.$inertia.post('/logout',{
    _token: this.$props.csrf_token
})

This link helped me

,

我认为有更好的方法来做到这一点。我会和你分享一个想法。

关于代币

没有必要像您一样由后端向前端共享令牌。

关于Vue组件中的代码

由于您的表单,注销无效。

您的表单发布

<form method="POST" :action="$route('logout')">
   <input type="hidden" name="_token" :value="csrf">
   <button type="submit">Logout</button>
</form>

表单POST的最佳方式

<form @submit.prevent="logout()">
   <button as="button" type="submit">
        Logout
   </button>
</form>

如您所见,当您提交表单时,它会调用 vue 组件的一个名为“注销”的方法。方法:

export default{
    // Some code...
    
    methods:{
        logout() {
            this.$inertia.post(route('logout'));
        },}
}

以这种方式进行注销过程,所有的逻辑注销都会由服务器端来处理。您不必担心令牌。

希望对你有用。我也感谢你,因为我刚刚找到了这个解决方案,因为你的回答。