我正在尝试设置注销路由。
我发现了很多blade语法(像那样(,但没有一个使用vuejs。因此,我试图通过插入一个值为csrf令牌、名称设置为"的输入来复制刀片语法的结果_令牌";。(csrf变量包含位于XSRF-TOKEN cookie中的字符串(。
当我发布时,我在控制台中出现以下错误:POST http://localhost:3000/logout 419(未知状态(
你能告诉我我的错误在哪里吗?如何正确注销并重定向到我选择的页面?
<form method="POST" :action="$route('logout')">
<input type="hidden" name="_token" :value="csrf">
<button type="submit">Logout</button>
</form>
我认为有更好的方法。我会和你分享一个想法。
关于令牌
没有必要像您所做的那样,通过后端向前端共享令牌。
关于Vue组件中的代码
由于您的表单,注销不起作用。
您的表单POST
<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'));
},
}
}
以这种方式进行注销过程,所有逻辑注销都将由服务器端处理。您将不必担心代币。
我希望它对你有用。我也很感谢你,因为我刚刚因为你的回答找到了这个解决方案。
我找到了解决方案。
我的错误是在恢复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
})
这个链接帮助我