Tomcat 9中BaseInterceptor依赖JAR缺失及拦截器实现方式咨询
Tomcat 9中BaseInterceptor的状态与替代方案
嘿,我来帮你理清楚这个问题!首先给你明确结论:BaseInterceptor确实已经被弃用,而且在Tomcat 9中已经被移除了,这就是你找不到对应依赖的核心原因。
为什么找不到BaseInterceptor的依赖?
- BaseInterceptor本质是Tomcat的内部私有API,不属于Servlet规范的一部分,官方从来没有把它作为对外公开的扩展接口。它原本是Tomcat早期版本里用于内部拦截的实现类,设计初衷就不是给外部开发者用的,所以你在公共Maven仓库里根本找不到对应的依赖包。
- 从Tomcat 8.5开始,官方就对内部拦截机制进行了重构,到Tomcat 9时直接移除了BaseInterceptor类,所以即使你手动去找旧版本的catalina.jar,也没法在Tomcat 9里用。
推荐的替代方案
根据你的请求拦截需求,有两种靠谱的选择,优先推荐标准方案:
1. 标准Servlet Filter(最推荐)
这是Java EE/Servlet规范定义的标准拦截方式,所有Servlet容器(Tomcat、Jetty、Undertow等)都支持,完全不受Tomcat版本限制,兼容性拉满。
示例代码:
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(urlPatterns = "/*") // 拦截所有请求 public class RequestLoggingFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { // 初始化逻辑,比如加载配置 } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 拦截请求前的处理逻辑 var httpReq = (javax.servlet.http.HttpServletRequest) req; System.out.println("收到请求:" + httpReq.getMethod() + " " + httpReq.getRequestURI()); // 放行请求,让后续过滤器或目标资源处理 chain.doFilter(req, res); // 响应返回后的处理逻辑 var httpRes = (javax.servlet.http.HttpServletResponse) res; System.out.println("响应状态:" + httpRes.getStatus()); } @Override public void destroy() { // 销毁逻辑,比如释放资源 } }
只需要在项目中引入Servlet API依赖即可(Tomcat 9对应Servlet 4.0版本):
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> <!-- 运行时Tomcat会自带,打包无需包含 --> </dependency>
2. Tomcat专属Valve(需Tomcat特定功能时用)
如果你的拦截逻辑必须依赖Tomcat的内部特性(比如直接操作Tomcat的Request/Response对象),可以用Tomcat官方推荐的Valve接口,这是Tomcat内部扩展的标准方式,比旧的BaseInterceptor稳定得多。
示例代码:
import org.apache.catalina.Valve; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.valves.ValveBase; import javax.servlet.ServletException; import java.io.IOException; public class CustomRequestValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { // 请求拦截前的逻辑 System.out.println("Tomcat Valve拦截请求:" + request.getRequestURI()); // 调用下一个Valve或目标容器 getNext().invoke(request, response); // 响应处理后的逻辑 System.out.println("Tomcat Valve响应状态:" + response.getStatus()); } }
需要引入Tomcat的catalina-api依赖:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina-api</artifactId> <version>9.0.80</version> <!-- 对应你的Tomcat 9版本 --> <scope>provided</scope> </dependency>
然后在Tomcat的server.xml或context.xml中配置这个Valve,比如在<Host>节点下添加:
<Valve className="com.yourpackage.CustomRequestValve" />
总结
- 优先用Servlet Filter,这是标准方案,跨容器兼容,不会因为Tomcat版本升级而失效;
- 只有当你需要Tomcat专属功能时,再考虑用Valve,这是Tomcat官方认可的扩展方式;
- BaseInterceptor已经彻底被弃用移除,不要再尝试使用它了。
内容的提问来源于stack exchange,提问作者Dieguinho




