如何通过Postman Interceptor获取Spring Security返回的X-CSRF-TOKEN
问题根因
- 你当前的Spring Security配置未显式指定CSRF Token存储方式,默认使用
HttpSessionCsrfTokenRepository将Token存在服务端Session中,不会主动向客户端下发X-CSRF-TOKEN类型的Cookie。Postman Interceptor只能抓取服务端通过Set-Cookie头实际下发的Cookie,自然拿不到对应字段。 - 即使开启CSRF防护,如果没有配置Cookie形式的Token存储逻辑,客户端永远不会收到对应的CSRF Cookie,和Postman Interceptor的开关配置没有关系。
分步解决操作
1. 调整Spring Security配置
将原有configure方法替换为如下配置,显式指定CSRF Token通过Cookie下发,修改完成后重启服务:
@Override protected void configure(HttpSecurity http) throws Exception { // 配置CSRF Token存储策略:存在Cookie中、关闭HttpOnly属性允许前端/Postman读取 CookieCsrfTokenRepository csrfTokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse(); // 自定义Cookie名称为你需要的X-CSRF-TOKEN csrfTokenRepository.setCookieName("X-CSRF-TOKEN"); // 自定义校验时读取的请求头名称 csrfTokenRepository.setHeaderName("X-CSRF-TOKEN"); http .authorizeRequests() .antMatchers("/", "index", "/css/*", "/js/*").permitAll() .antMatchers("/api/**").hasRole(STUDENT.name()) .anyRequest() .authenticated() .and() .csrf() .csrfTokenRepository(csrfTokenRepository) .and() .httpBasic(); }
必须配置
withHttpOnlyFalse(),否则下发的Cookie会携带HttpOnly属性,Postman和前端脚本都无法读取到Token值。
2. Postman + Interceptor正确操作流程
配置完服务端后按以下顺序操作,不需要额外修改Interceptor的默认抓包规则:
- 打开Postman右上角的Interceptor开关,确认Postman和本地Interceptor插件连接状态正常(插件图标点亮、Postman端Interceptor状态栏显示已连接)
- 先构造GET类型请求,地址填写你配置中放行的匿名访问路径(比如根路径
/或者/index),在Authorization标签页选择Basic Auth,填入你准备好的用户名密码后发送请求 - 请求返回200状态码后,点开Postman响应面板的Cookies标签,即可看到服务端下发的
X-CSRF-TOKEN和SESSIONID两个Cookie - 后续发送POST/PUT/DELETE等需要CSRF校验的请求时,保持Interceptor开启即可,Postman会自动读取Cookie中的
X-CSRF-TOKEN值,拼接在对应请求头中完成校验,不需要手动复制粘贴。
常见排错点
如果完成上述操作后仍然拿不到对应Cookie,逐一排查以下问题:
- 确认服务端修改配置后已成功重启,启动日志中没有CSRF相关的配置报错
- 确认第一次发起的是GET/HEAD/OPTIONS这类幂等请求,Spring Security的CSRF过滤器不会拦截这类请求,只有这类请求正常响应时,才会触发CSRF Cookie的下发逻辑;如果一开始就发POST请求,会被CSRF校验直接拦截,根本不会走到Cookie下发的逻辑
- 确认请求地址和服务端实际运行的域名、端口完全一致,域名或端口不匹配时Postman会直接拒绝存储对应Cookie
- 暂时关闭系统全局代理、其他抓包工具,避免代理转发过程中丢失
Set-Cookie响应头
内容的提问来源于stack exchange,提问作者Ceki101
相关产品推荐
相关产品推荐

