React项目中Spring Boot无法接收Axios传递的请求头问题
React + Axios 调用 Spring Boot 后端(带 Bearer Token)
我来帮你把代码规范整理好,再补充几个实际开发中要注意的细节:
一、React 客户端 Axios 请求代码
你原来的写法逻辑没问题,建议把 Token 抽出来(不要硬编码),这样更符合实际登录后的场景:
// 从本地存储读取登录后得到的 Token(比如登录成功后存在 localStorage 里) const authToken = localStorage.getItem('userToken'); // 配置请求选项 const requestOptions = { withCredentials: true, headers: { 'Authorization': `Bearer ${authToken}` } }; // 发送 POST 请求 axios.post('http://localhost:9090/services/list', null, requestOptions) .then(response => { console.log('请求成功返回数据:', response.data); }) .catch(error => { // 更友好的错误打印,区分不同错误场景 if (error.response) { console.error('后端返回错误:', error.response.status, error.response.data); } else if (error.request) { console.error('无响应返回:', error.request); } else { console.error('请求配置错误:', error.message); } });
二、Spring Boot 后端控制器代码
对应的控制器可以这样写,用来接收并处理 Authorization 请求头:
import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/services") public class ServiceController { @PostMapping("/list") public ResponseEntity<List<String>> getServiceList( // 直接获取 Authorization 请求头 @RequestHeader("Authorization") String authorizationHeader) { // 解析 Bearer Token:去掉前缀 "Bearer " 拿到实际的 Token 字符串 String token = authorizationHeader.replace("Bearer ", "").trim(); // 这里可以添加 Token 验证逻辑(比如用 JWT 工具类解析验证) // 示例:假设验证通过后,返回业务数据 List<String> serviceList = List.of("服务A", "服务B", "服务C"); return ResponseEntity.ok(serviceList); } }
三、关键注意事项
- 跨域(CORS)配置:因为你开启了
withCredentials: true,Spring Boot 必须配置允许携带凭证,并且不能用通配符*作为允许的 Origin,要指定你的 React 应用地址:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:3000") // React 应用的运行端口 .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } }
- Token 过期处理:建议在 Axios 里添加请求拦截器,统一处理 Token 过期的情况,比如收到后端返回的 401 状态码时,自动跳转到登录页面重新获取 Token。
- 安全提示:前端存储 Token 时,要注意防范 XSS 攻击,尽量避免在页面中直接暴露 Token 内容。
内容的提问来源于stack exchange,提问作者RDV




