更改提交时 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 令牌)。怎么修?
Spring Security CSRF 令牌不适用于 AJAX 调用和表单提交在同一个 JSP 中
页面中所有表单的 Laravel 5 CSRF 全局令牌隐藏字段