我有一个“客户详细信息”表格,该表格提交POST请求。这在Spring Boot应用程序中,并作为Thymeleaf模板实现。我刚刚在表单中添加了一个小的AJAX函数-当用户单击某个按钮时,它使用jQuery.ajax()根据客户的地址查找地理代码。 AJAX调用是一个GET请求。
如果我输入客户表单并在不触摸Ajax按钮的情况下单击“提交”,则它将正常提交。但是,如果我先使用Ajax按钮,然后尝试提交表单,则它会被CsrfFilter
停止,并显示消息“ Invalid CSRF token found for http://...
”。
我假设Ajax调用以某种方式使CSRF令牌过期,因此需要一个新的令牌,但是如何防止这种情况呢?
[[0]存在一些类似的问题,但在那种情况下,他们正在寻找一种将CSRF令牌添加到Ajax请求的方法。另外,我正在使用Thymeleaf视图,因此可以将CSRF令牌自动插入到表单中-无需手动添加。
问题是我实现了一个自定义过滤器,以删除每个请求的安全上下文。正如我记录的this one,这是我制作应用程序stateless的方式。那会删除(或重置?)服务器端CSRF令牌,因此它与表单中的令牌不匹配,但是,自定义过滤器会触发[[after in this software engineering SE answer,因此我以前从未遇到过表单提交问题。
在这种情况下,虽然我有为客户端构建表单之后但在提交表单之前处理的Ajax请求,所以我的自定义过滤器的不幸副作用是表单提交失败。我修改了自定义过滤器,以纠正跳过,如果URL在特定目录路径下,则跳过删除上下文:
CsrfFilter