Servlet 过滤器的作用
Servlet 过滤器用于在请求到达 Servlet 之前和响应返回客户端之前对请求和响应进行预处理和后处理。过滤器可以用于:
- 请求和响应的修改:可以修改请求和响应的内容。
- 日志记录:记录请求和响应的信息,便于调试和监控。
- 身份验证和授权:检查用户的身份和权限。
- 性能监控:分析请求的处理时间。
- 跨域请求处理:处理 CORS(跨域资源共享)相关的请求。
Servlet 过滤器的基本结构
一个 Servlet 过滤器需要实现javax.servlet.Filter
接口,并重写以下方法:
init(FilterConfig filterConfig)
:初始化过滤器。doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
:对请求和响应进行处理。destroy()
:销毁过滤器。
示例项目
下面是一个简单的 Servlet 过滤器示例项目,展示如何创建和使用过滤器。
1. 创建 Maven 项目
首先,创建一个 Maven 项目,并在pom.xml
中添加 Servlet API 依赖:
<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
</dependencies>
2. 创建过滤器
创建一个简单的过滤器,记录请求的开始时间和结束时间:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*") // 过滤所有请求
public class LoggingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化代码}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {long startTime = System.currentTimeMillis();// 继续处理请求chain.doFilter(request, response);long duration = System.currentTimeMillis() - startTime;System.out.println("Request processed in " + duration + " ms");}@Overridepublic void destroy() {// 清理资源}
}
3. 创建 Servlet
创建一个简单的 Servlet,返回一个欢迎消息:
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;
import java.io.PrintWriter;@WebServlet("/welcome")
public class WelcomeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<h1>Welcome to the Servlet Filter Example!</h1>");}
}
4. 配置 web.xml(可选)
如果不使用注解,可以在web.xml
中配置过滤器和 Servlet:
<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><filter-name>LoggingFilter</filter-name><filter-class>your.package.LoggingFilter</filter-class></filter><filter-mapping><filter-name>LoggingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>WelcomeServlet</servlet-name><servlet-class>your.package.WelcomeServlet</servlet-class></servlet><servlet-mapping><servlet-name>WelcomeServlet</servlet-name><url-pattern>/welcome</url-pattern></servlet-mapping></web-app>
5. 运行项目
- 部署到支持 Servlet 的容器(如 Apache Tomcat)。
- 访问
http://localhost:8080/your-app/welcome
,你应该会看到欢迎消息,并且在控制台中会打印请求处理的时间。
参考:ChatGPT