You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),确保资源路径始终正确。

三、验证步骤

  1. 重新部署应用
  2. 访问登录页面,打开浏览器开发者工具(F12),查看Network标签,确认login.css的返回状态是200,且内容是CSS代码
  3. 测试登录流程,确认输入正确/错误账号时的跳转逻辑正常,没有重定向循环报错

内容的提问来源于stack exchange,提问作者NashPL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:19:05