如何禁止Tomcat处理/WEB-INF请求,让Web应用接管所有路径?
解决Tomcat拦截{myApp}/WEB-INF路径请求的问题
我之前部署Web应用时也碰到过一模一样的情况,Tomcat默认会把/WEB-INF/开头的请求拦下来返回404,要让这些请求转交给你的应用处理,可以试试下面几个可行的方案:
方法1:扩展Servlet映射(适用于Servlet/Spring MVC类应用)
如果你的应用核心是用DispatcherServlet(比如Spring MVC项目)或者自定义Servlet驱动的,直接调整映射规则,把/WEB-INF/*纳入到应用的处理范围就行:
方式A:web.xml配置
<servlet> <servlet-name>yourAppServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 其他初始化参数 --> </servlet> <servlet-mapping> <servlet-name>yourAppServlet</servlet-name> <url-pattern>/</url-pattern> <url-pattern>/WEB-INF/*</url-pattern> <!-- 新增这个映射规则 --> </servlet-mapping>
方式B:Java代码配置(Spring Boot/纯Java Web项目)
@Configuration public class WebAppConfig { @Bean public ServletRegistrationBean<DispatcherServlet> appServletRegistration() { DispatcherServlet servlet = new DispatcherServlet(); // 这里把"/"和"/WEB-INF/*"都作为映射路径 ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(servlet, "/", "/WEB-INF/*"); registration.setName("yourAppServlet"); return registration; } }
配置完成后,你的应用Servlet就会接管所有/WEB-INF/开头的请求,接下来只需要在控制器里写对应的处理逻辑就行,比如Spring MVC里的@RequestMapping("/WEB-INF/**")方法。
方法2:自定义Tomcat Valve(更底层的控制)
如果不想修改Servlet映射,或者需要更灵活的请求转发逻辑,可以自定义一个Tomcat Valve来拦截请求并转交给应用:
public class WebInfForwardValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { String requestURI = request.getRequestURI(); // 判断请求路径是否以/WEB-INF/开头 if (requestURI.startsWith("/WEB-INF/")) { // 转发到你的应用核心处理入口 request.getRequestDispatcher("/app-core-handler").forward(request, response); return; } // 非目标路径继续走Tomcat默认流程 getNext().invoke(request, response); } }
然后把这个Valve配置到Tomcat的Context中(可以通过context.xml或者代码方式配置),就能让所有/WEB-INF/请求先经过这个Valve转交给你的应用处理。
注意事项
- 尽量避免直接暴露WEB-INF下的静态资源,如果是要处理静态文件,建议把资源移到
src/main/resources/static这类公开目录,或者通过专门的静态资源处理器来处理,毕竟WEB-INF原本就是Tomcat默认保护的目录。 - 确保你的应用控制器能正确解析
/WEB-INF/开头的路径,比如Spring MVC中要注意@RequestMapping的路径匹配规则是否覆盖到这类请求。
内容的提问来源于stack exchange,提问作者vagcore
相关产品推荐
相关产品推荐

