You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.xmlcontext.xml中配置这个Valve,比如在<Host>节点下添加:

<Valve className="com.yourpackage.CustomRequestValve" />

总结

  • 优先用Servlet Filter,这是标准方案,跨容器兼容,不会因为Tomcat版本升级而失效;
  • 只有当你需要Tomcat专属功能时,再考虑用Valve,这是Tomcat官方认可的扩展方式;
  • BaseInterceptor已经彻底被弃用移除,不要再尝试使用它了。

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

火山引擎 最新活动