调用取款接口时出现ERR_TOO_MANY_REDIRECTS 302错误求助
问题排查与解决方法
核心问题定位
请求被多次重定向至/login,本质是后端未识别到有效认证信息,触发Spring Security的未认证拦截逻辑,若登录页面也需要认证或拦截规则配置不当,就会陷入循环重定向。
分步排查与修复
1. 前端请求头配置错误(最可能原因)
你的axios put调用参数位置错误:axios的语法是axios.put(url[, data[, config]]),你把headers放在了第二个参数(请求体位置),导致后端根本没收到Authorization头,直接判定为未认证。
修复代码:
const REST_API_BASE_URL = 'http://localhost:8080'; const token = localStorage.getItem('accessToken'); export const withdrawMoney = async (accountId, amountToWithdraw) => { return await axios.put( REST_API_BASE_URL + `/account/withdraw/${accountId}/${amountToWithdraw}`, null, // PUT请求无请求体时传null占位 { headers: { 'Authorization': `Bearer ${token}`, }, } ) }
2. 验证Token有效性
- 打开浏览器控制台,执行
localStorage.getItem('accessToken'),检查Token是否存在、格式是否正确(JWT Token通常是三段式字符串)。 - 解析Token检查是否过期、Claims中的用户信息是否正确(可直接在控制台写代码解析,或用本地工具验证)。
- 如果Token过期,调用刷新Token接口重新获取有效Token后重试请求。
3. 后端Spring Security配置检查
- 确保
/account/withdraw/**路径被配置为需要认证的资源,同时**/login路径必须允许匿名访问**,否则未认证请求跳转到/login后会再次被拦截,引发循环重定向。示例配置:
@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login").permitAll() // 允许匿名访问登录接口 .antMatchers("/account/withdraw/**").authenticated() // 取款接口需要认证 .and() .formLogin() // 或你的JWT认证配置 .loginPage("/login"); }
- 检查JWT认证过滤器是否正确生效:确保过滤器能解析请求头中的Token,并将Authentication对象存入
SecurityContextHolder。 - 若启用了CSRF保护:前后端分离场景下可临时禁用CSRF用于排查,或配置前端正确传递CSRF Token:
http.csrf().disable();
4. 跨域(CORS)配置检查
确保后端配置了允许前端域名的跨域请求,否则请求可能被浏览器拦截,间接引发认证失败。示例CORS配置:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://你的前端域名:端口") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true); } }
内容的提问来源于stack exchange,提问作者Marius Carchilan
相关产品推荐
相关产品推荐

