ServletModule配置serve映射无法找到login.jsp页面报404
问题原因
两个核心配置错误导致访问login.jsp返回404:
- 空的
serve()规则无效:Guice Servlet的路径绑定规则要求serve()必须链式调用with()指定处理请求的Servlet,单独写serve("/login.jsp");只会把该路径标记为Guice接管,不会自动把请求转发给容器内置的JSP解析Servlet,相当于占了路由但没写处理逻辑,直接返回404。 - 全局过滤器拦截所有请求:你配置的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()中添加如下绑定:
Tomcat、Jetty等主流Web容器的默认Servlet名称固定为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); } });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
相关产品推荐
相关产品推荐

