Spring Security 4.0中AJAX设CSRF头仍报403错误求助
解决Spring Security 4.0 CSRF认证下AJAX POST 403错误的问题
我来帮你搞定这个头疼的403问题!你遇到的核心问题是前端获取CSRF令牌的方式错误,咱们一步步拆解:
1. 最关键的错误:AJAX获取令牌的属性不对
你现在的JS代码里用attr("th:content")去读取meta标签的令牌值,但th:content是Thymeleaf的服务端渲染属性,当页面渲染完成后,浏览器里的HTML标签会把th:content转换成原生的content属性。所以你取错了属性,导致拿到的是无效值,这才触发了CSRF校验失败的403错误。
修正后的AJAX代码:
// 重点:获取content属性,不是th:content var token = $("meta[name='_csrf']").attr("content"); var header = $("meta[name='_csrf_header']").attr("content"); $.ajax({ type : "POST", url : "/PRIT/Home/PopulateVisits", async: false, beforeSend: function(xhr) { if (header && token) { xhr.setRequestHeader(header, token); } }, // ... 你的其他AJAX逻辑 });
2. 额外的验证步骤(确保万无一失)
- 检查页面渲染后的meta标签:右键页面→查看源码,确认
<meta name="_csrf" content="你的令牌值"/>和<meta name="_csrf_header" content="X-CSRF-TOKEN"/>是否正确生成,这能确认Thymeleaf已经把CSRF令牌注入到页面了。 - 确认Spring Security CSRF配置:如果你自定义了Security配置,确保没有禁用CSRF(Spring Security 4.0默认是开启的)。如果是用Java配置,类似这样的配置是正确的:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf() // 默认开启CSRF保护 .and() // 其他配置... } }
- 核对请求路径:确保AJAX的
url: "/PRIT/Home/PopulateVisits"和控制器的@RequestMapping(value = "/Home/PopulateVisits")完全匹配,注意上下文路径/PRIT是否和你的应用配置一致。
总结
这个问题是Thymeleaf渲染后属性变化导致的典型错误,只要把JS里的th:content改成content,就能正确获取到有效的CSRF令牌,POST请求就能正常访问控制器了。
内容的提问来源于stack exchange,提问作者nexus




