Spring Security OAuth资源服务:PUT请求Postman可用Axios返回401
问题分析与解决方案
核心问题:Axios PUT请求参数顺序错误
你前端的Axios PUT请求写法有误,导致Authorization头未被正确携带。Axios的put方法签名为:
axios.put(url[, data[, config]])
你把包含headers的配置对象放在了第二个参数(请求体的位置),而你的PUT接口不需要请求体,这就导致headers根本没被应用到请求上。后端没收到JWT令牌,自然会将请求判定为匿名,返回401。
修复前端请求代码
将headers移到第三个参数位置,第二个参数传null(因为接口不需要请求体):
async saveCurrentChanges() { await axios.put( "http://localhost:8080/api/test", null, // 无请求体时传null或空对象 { headers: { "Authorization": "Bearer " + getAuth().currentUser.accessToken }} ).then((response) => { console.log("success"); }).catch((error) => { console.log(error); }); },
补充:完善Spring Security的CORS配置
当前你使用的cors(Customizer.withDefaults())会复用Spring MVC的CORS配置,建议添加全局CORS配置类,明确允许携带自定义头、PUT方法等,避免预检请求失败:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:你的前端端口") // 替换为你的前端实际地址 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true); } }
额外验证步骤
- 打开浏览器开发者工具的Network标签,查看PUT请求的Request Headers,确认Authorization头是否存在
- 检查
getAuth().currentUser.accessToken是否获取到了有效、未过期的JWT令牌
内容的提问来源于stack exchange,提问作者ylr
相关产品推荐
相关产品推荐

