You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动