更改提交时 Ajax 表单上的 CSRF 令牌不匹配

Posted

技术标签:

【中文标题】更改提交时 Ajax 表单上的 CSRF 令牌不匹配【英文标题】:CSRF Token mismatch on Ajax Form on change submission 【发布时间】:2016-07-04 09:49:18 【问题描述】:

我有一个公共表单,它在 jquery onchange 事件上发送 Ajax 请求,有时是由于在我开始得到 TokenMismatchException 的时间间隔内发送的请求数量。

我正在使用以下方式发送 csrf 令牌:

$.ajaxSetup( 

   headers:  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')  

);

我的情况有什么解决方案?延长 csrf 令牌的生命周期?想法?

【问题讨论】:

你可能想看看类似的东西:github.com/GeneaLabs/laravel-caffeine 您是否 100% 确定 TokenMismatchException 是由请求数引起的?你是怎么得出这样的结论的?我有TokenMismatchException,因为用户使用的是 IE。如果您有任何 IE 用户,也许值得调查。 robinz.in/csrf-token-session-error-with-laravel-on-ie-edge 可以在VerifyCsrfToken中间件中排除路由。 不确定这 100% 但您可以在 ajaxSetup 中放置 cache: false, 以防止令牌被缓存。或者您可以将 _token 包含在数据中而不是标题中。 @AlexMansour 好的。那么这个问题是不是因为有并发请求时没有正确调用$.ajaxSetup?这意味着您的数据正在通过,但 csrf 令牌没有,对吗?如果是这样,也许可以考虑 Can Celik 的建议:“......将 _token 包含到您的数据中而不是标题中。” 【参考方案1】:

如果调用没有处理任何敏感信息,则将路由放入 VerifyCsrfToken 类的 except 数组中。

【讨论】:

以上是关于更改提交时 Ajax 表单上的 CSRF 令牌不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Ajax GET 请求后表单提交失败(无效的 CSRF 令牌)。怎么修?

Laravel csrf 令牌在 ajax 上第二次不匹配

Spring Security CSRF 令牌不适用于 AJAX 调用和表单提交在同一个 JSP 中

页面中所有表单的 Laravel 5 CSRF 全局令牌隐藏字段

在 django 中使用 ajax 表单发布 csrf 令牌的这种方法有啥问题?

提交表单时,会话变量会更改值。