Java Web加载CSS触发登录重定向问题求助
解决登录页面静态资源加载失败与重定向循环问题
看起来你遇到了两个关联的核心问题:静态资源(CSS)无法正确加载,以及浏览器报ERR_TOO_MANY_REDIRECTS错误。我来帮你拆解根源,一步步解决:
一、问题根源分析
你的LoginServlet大概率配置了/*的映射路径(拦截所有请求),当浏览器请求/resource/css/login.css时,这个静态资源请求会被LoginServlet接管。此时username和password参数都是null,Servlet会转发回login.jsp;而login.jsp又会再次请求该CSS文件,触发新一轮的Servlet处理,形成无限循环,最终导致浏览器报错。
同时,因为Servlet把静态资源请求当成登录请求处理,转发回了HTML页面,所以浏览器收到的是login.jsp的HTML内容而非CSS文件,这就是CSS不生效的直接原因。
二、分步解决方案
1. 修复LoginServlet的逻辑错误
你的Servlet代码存在几个明显的bug,先修正它们:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置缓存控制 response.setHeader("Cache-Control", "private, no-store, no-cache, must-revalidate"); response.setHeader("Pragma", "no-cache"); String usr = request.getParameter("username"); String psw = request.getParameter("password"); // 正确判断参数为空的情况:用equals而非==,同时检查username和password if (usr == null || usr.trim().isEmpty() || psw == null || psw.trim().isEmpty()) { request.setAttribute("error", "Invalid Username or Password"); RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/login.jsp"); dispatcher.forward(request, response); return; // 必须添加return,避免后续代码执行导致冲突 } List res = userLoginUtils.logIn(usr, psw); Boolean debugFlag = true; if (res.get(0).equals("true") || debugFlag) { this.writeToSession(res.get(1), request); response.sendRedirect("index"); // 登录成功后重定向到首页 } else { request.setAttribute("error", "Invalid Username or Password"); RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/login.jsp"); dispatcher.forward(request, response); } }
关键修改点:
- 字符串内容比较要用
equals(),不能用==(==比较的是对象引用而非内容) - 修正了重复判断
password的错误,加入了username的检查 - 转发后添加
return,避免后续的sendRedirect执行,导致请求冲突
2. 配置web.xml,让静态资源不被Servlet拦截
修改Servlet映射规则,避免拦截所有请求,同时让容器默认Servlet处理静态资源:
<!-- 配置默认Servlet处理静态资源(Tomcat等容器自带) --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/resource/*</url-pattern> </servlet-mapping> <!-- 你的LoginServlet映射:只拦截登录相关请求 --> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.yourpackage.LoginServlet</servlet-class> <!-- 替换成你的实际包路径 --> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> <!-- 不要用/*,这会拦截所有请求 --> </servlet-mapping>
这样配置后,所有/resource/*路径下的静态资源(CSS、JS、图片等)都会由容器默认Servlet处理,不会被LoginServlet拦截,从根源上解决循环问题。
3. 修正login.jsp中的CSS路径
使用上下文路径确保CSS路径正确,避免部署路径变化导致的资源找不到:
<link rel="stylesheet" href="${pageContext.request.contextPath}/resource/css/login.css">
${pageContext.request.contextPath}会自动获取你的应用上下文路径(比如/AppV2),确保资源路径始终正确。
三、验证步骤
- 重新部署应用
- 访问登录页面,打开浏览器开发者工具(F12),查看Network标签,确认
login.css的返回状态是200,且内容是CSS代码 - 测试登录流程,确认输入正确/错误账号时的跳转逻辑正常,没有重定向循环报错
内容的提问来源于stack exchange,提问作者NashPL
相关产品推荐
相关产品推荐

