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

ServletModule配置serve映射无法找到login.jsp页面报404

问题原因

两个核心配置错误导致访问login.jsp返回404:

  1. 空的serve()规则无效:Guice Servlet的路径绑定规则要求serve()必须链式调用with()指定处理请求的Servlet,单独写serve("/login.jsp");只会把该路径标记为Guice接管,不会自动把请求转发给容器内置的JSP解析Servlet,相当于占了路由但没写处理逻辑,直接返回404。
  2. 全局过滤器拦截所有请求:你配置的CorsFilter、PersistFilter、GuiceShiroFilter等全部匹配"*"路径,覆盖了全量请求,如果过滤器链没有对JSP路径做放行、也没有主动把请求转发给容器默认Servlet,请求根本到不了JSP解析环节。

另外提前排除非Guice的基础问题:如果用内嵌Tomcat/Jetty,要确认已经引入JSP解析依赖(比如Tomcat的tomcat-embed-jasper);打包后解压构建产物,确认login.jsp位于war包根目录,和src/main/webapp的存放路径对应。

修复步骤

按顺序调整即可:

  • 直接删除无效配置行serve("/login.jsp");
  • 添加JSP请求转发规则,把所有JSP请求交给容器默认Servlet处理,在configureServlets()中添加如下绑定:
    serve("*.jsp").with(new HttpServlet() {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getServletContext().getNamedDispatcher("default").forward(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    });
    
    Tomcat、Jetty等主流Web容器的默认Servlet名称固定为default,上面的写法可以直接把所有JSP请求转交给容器原生的JSP解析逻辑处理,不需要额外依赖。
  • 检查过滤器链的放行规则:
    • 由于你配置了GuiceShiroFilter,需要在Shiro的权限规则里添加/login.jsp = anon,允许匿名访问该页面,否则请求会被Shiro拦截,同样会返回404。
    • 自定义的AppFilter、PostSessionTenantFilter等业务过滤器不要中断JSP路径的过滤链,不要对JSP请求提前写入响应。
  • 基础环境校验:临时注释掉Guice Filter的拦截配置,直接访问/login.jsp,如果此时仍然404,优先排查JSP文件打包路径、容器JSP支持依赖问题,和Guice配置无关。

内容的提问来源于stack exchange,提问作者Maher Ben Taleb Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:48:54