在 Java Web 开发中,过滤器(Filter)是一种用于拦截和处理请求和响应的组件。它们在 `Servlet` 请求到达目标 `Servlet` 之前,或者在响应发送给客户端之前,对请求和响应进行预处理或后处理。过滤器在许多场景中都非常有用,比如实现认证、日志记录、数据压缩等功能。
### 过滤器的使用步骤
1. **创建过滤器类**
2. **配置过滤器**
3. **实现过滤器逻辑**
### 1. 创建过滤器类
一个过滤器类必须实现 `javax.servlet.Filter` 接口,并重写其中的三个方法:`init`、`doFilter` 和 `destroy`。
```java
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器初始化代码
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 处理请求的代码
System.out.println("Request received at MyFilter");
// 继续执行下一个过滤器或目标资源
chain.doFilter(request, response);
// 处理响应的代码
System.out.println("Response leaving MyFilter");
}
@Override
public void destroy() {
// 过滤器销毁时的代码
}
}
```
### 2. 配置过滤器
过滤器可以通过两种方式进行配置:在 `web.xml` 文件中进行配置,或使用注解。
#### 使用 `web.xml` 配置
在 `WEB-INF/web.xml` 文件中添加以下配置:
```xml
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 拦截所有请求 -->
</filter-mapping>
```
#### 使用注解配置
自 Servlet 3.0 之后,可以使用 `@WebFilter` 注解来配置过滤器:
```java
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*") // 拦截所有请求
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器初始化代码
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 处理请求的代码
System.out.println("Request received at MyFilter");
// 继续执行下一个过滤器或目标资源
chain.doFilter(request, response);
// 处理响应的代码
System.out.println("Response leaving MyFilter");
}
@Override
public void destroy() {
// 过滤器销毁时的代码
}
}
```
### 3. 实现过滤器逻辑
在 `doFilter` 方法中,可以实现具体的过滤逻辑。例如,检查用户是否已登录:
```java
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession session = httpRequest.getSession(false);
if (session == null || session.getAttribute("user") == null) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login.jsp");
} else {
chain.doFilter(request, response); // 用户已登录,继续处理请求
}
}