Skip to content

tomcat的过滤器机制简单实现

nixub edited this page Sep 13, 2024 · 1 revision

2024年9月12日 1:22 Tomcat 的过滤器(Filter)机制允许在请求和响应处理的过程中插入自定义的逻辑。你可以使用过滤器来处理请求数据、修改响应内容、执行日志记录、进行身份验证等。下面是如何在 Java Servlet 环境中实现一个简单的过滤器的示例。

  1. 创建一个 Filter 首先,你需要创建一个实现 javax.servlet.Filter 接口的过滤器类。过滤器需要实现 doFilter 方法,来定义在请求和响应处理过程中要执行的逻辑。 ExampleFilter.java
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class ExampleFilter implements Filter {
@Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化过滤器,读取配置参数(如果有)
        System.out.println("Filter initialized");
    }
@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 在请求处理之前
        System.out.println("Request received at: " + System.currentTimeMillis());
// 继续调用下一个过滤器或目标资源
        chain.doFilter(request, response);
// 在响应处理之后
        System.out.println("Response sent at: " + System.currentTimeMillis());
    }
@Override
    public void destroy() {
        // 清理过滤器资源
        System.out.println("Filter destroyed");
    }
}
  1. 配置过滤器 你需要在 web.xml 文件中配置你的过滤器。配置包括定义过滤器和设置过滤器的 URL 映射。 web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
<!-- Filter Definition -->
    <filter>
        <filter-name>ExampleFilter</filter-name>
        <filter-class>com.example.sessiondemo.ExampleFilter</filter-class>
    </filter>
<!-- Filter Mapping -->
    <filter-mapping>
        <filter-name>ExampleFilter</filter-name>
        <url-pattern>/*</url-pattern> <!-- Apply filter to all URLs -->
    </filter-mapping>
</web-app>
  1. 示例 Servlet 创建一个简单的 Servlet,用于测试过滤器的行为。 TestServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("<html><body>");
        response.getWriter().println("<h1>Test Servlet</h1>");
        response.getWriter().println("</body></html>");
    }
}
  1. 部署和测试 • 编译项目:使用 javac 或构建工具(如 Maven)编译项目。 • 部署到 Tomcat:将项目部署到 Apache Tomcat 或其他 Servlet 容器中。 • 访问 Servlet:通过浏览器访问 [http://localhost:8080/your-app/test,你应该能看到TestServlet 的输出,并且在控制台中看到 ExampleFilter 的日志,表明过滤器的 doFilter 方法在请求处理前后被调用。

总结

• Filter 类:实现 javax.servlet.Filter 接口,定义请求处理前后的逻辑。
• web.xml 配置:在 web.xml 文件中定义过滤器和其 URL 映射。
• Servlet 示例:创建一个简单的 Servlet 用于测试过滤器的工作。
• 部署和测试:将应用部署到 Tomcat,访问 Servlet 以验证过滤器的功能。

这个示例演示了如何创建一个简单的过滤器并将其应用于所有请求。你可以根据需要调整过滤器的行为和 URL 映射规则。