Java相关项目问题排查集合
一、后端相关问题
1.1、重定向的次数过多ERR TOO MANY REDIRECTS
1.1.1、背景:
SpringBoot项目在麒麟Linux系统部署,访问首页提示重定向的次数过多,由于是内网系统,所以整个过程都是通过和实施人员沟通进行尝试解决。
该网页无法正常运作
xxx.xxx.xxx.192 将您重定向的次数过多,
尝试删除您的 Cookie.
ERR TOO MANY REDIRECTS
1.1.2、排查问题思路
1、排除项目的问题
作为开发人员,第一步先排除是项目的问题,由于是其他项目,没有接触过,先拉取一份项目代码,本地debug模式启动。结果发现正常。
2、网上查找相关文章,大致方向为:
(1)前端代码问题:
这个URL上再次设置重定向,使其指向原来的页面。这样,浏览器就会陷入一个无限循环的重定向中。
查看了一下访问页面地址,查看代码,发现通过get请求接口方式,获取相关人员信息之后,返回前端ModelAndView。
(2)后端接口问题:
- 代码排查:检查所有重定向代码(如
redirect:/path
),确保终止条件正确,避免循环
// 错误示例:重定向到自身路径
@GetMapping("/path")
public String redirect() {
return "redirect:/path"; // 导致无限循环
}
(3)Nginx配置错误,导致循环跳转。
- 反向代理(如 Nginx)的
proxy_pass
配置错误,导致路径重复拼接。
(4)安全框架(如 Spring Security)的配置错误,导致权限检查循环。
- 现象:身份验证逻辑导致登录后无限重定向。
- 示例:
- 用户登录后,Session 未正确标记为已认证,每次请求都被重定向到登录页面。
- 安全框架(如 Spring Security)的配置错误,导致权限检查循环。
解决方式:
-
步骤:
-
检查安全框架配置:
例如 Spring Security 的配置文件中,确保登录页、白名单路径正确:@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login", "/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .defaultSuccessUrl("/home"); // 确保登录成功跳转路径正确 } }
-
检查 Session 状态:
登录成功后,确认 Session 中是否存储了正确的用户认证信息(如SecurityContextHolder
)。
-
(5). 过滤器(Filter)或拦截器(Interceptor)逻辑错误
- 现象:自定义的过滤器/拦截器未正确处理请求。
- 示例:
- 过滤器中对未登录用户重定向到登录页,但登录页本身也被拦截,导致循环。
解决方式:
-
步骤:
-
临时禁用自定义过滤器:
在web.xml
或配置类中注释掉自定义过滤器,逐步排查。 -
添加调试日志:
在过滤器中打印请求路径和重定向目标,观察是否触发循环:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletRequest httpRequest = (HttpServletRequest) request; String path = httpRequest.getRequestURI(); System.out.println("Filter processing path: " + path); // ... 其他逻辑 }
-
(6) SSL/TLS 配置问题
-
现象:HTTP 强制跳转 HTTPS 时配置错误。
-
示例:
- 服务器(如 Nginx/Tomcat)配置了 HTTPS 强制跳转,但应用内部也通过代码强制跳转 HTTPS。
- 负载均衡器(如 AWS ELB)未正确传递协议头,导致应用误判请求协议。
解决方式:
- 检查 SSL/TLS 配置
- 步骤:
- 禁用应用内的 HTTPS 强制跳转:
检查代码中是否有类似response.sendRedirect("https://...")
的逻辑,暂时注释。 - 确保服务器层统一处理 HTTPS:
在反向代理(如 Nginx)或负载均衡器中配置 HTTPS 跳转,而不是在应用层重复配置。 - 验证协议头传递:
如果使用反向代理,确保传递X-Forwarded-Proto
头部:
- 禁用应用内的 HTTPS 强制跳转:
# Nginx 配置示例
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Forwarded-Proto $scheme;
}
(7)清除浏览器Cookie
3、本地启动没问题,说明代码没问题。考虑配置和环境。
4、和实施人员沟通之后,要了SpringBoot配置文件、Nginx配置文件,Redis配置文件。关键配置看不出来什么问题。算了先绕过Nginx直接访问系统试试,仍然这样。说明系统自身有问题,可是上一步已经排除代码问题了。
5、让实施清除Cookie,换浏览器、换电脑重试仍然无效。
6、实施人员说系统为麒麟Linux系统,算了。还是先排除好排除的吧。
7、一顿搜索还是没有有效解决方式,最后还是回归本质看日志吧。
8、看了日志,才发现Redis密码认证错误。这个问题会引起重定向问题吗??不知道,先解决这个问题看看。
9、重新设置redis密码,部署系统,实施反馈可以访问了。
1.1.3、问题原因
通过日志排查出:redis认证问题,密码错误。