java过滤器如何过滤
Java过滤器的基本实现
在Java中,过滤器(Filter)是Servlet规范的一部分,主要用于在请求到达Servlet之前或响应发送给客户端之前对请求和响应进行预处理。过滤器的常见应用场景包括身份验证、日志记录、数据压缩、字符编码转换等。
创建过滤器类
创建一个过滤器需要实现javax.servlet.Filter接口。以下是一个简单的过滤器示例:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class SimpleFilter 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("Before servlet processing");
// 将请求传递给下一个过滤器或Servlet
chain.doFilter(request, response);
// 后处理响应
System.out.println("After servlet processing");
}
@Override
public void destroy() {
// 清理代码
}
}
配置过滤器
过滤器可以通过注解或web.xml文件进行配置:
注解方式:
@WebFilter(urlPatterns = {"/*"}, initParams = {
@WebInitParam(name = "param1", value = "value1")
})
web.xml方式:
<filter>
<filter-name>SimpleFilter</filter-name>
<filter-class>com.example.SimpleFilter</filter-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SimpleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
常见过滤操作
字符编码过滤:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
身份验证过滤:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
if (httpRequest.getSession().getAttribute("user") == null) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
return;
}
chain.doFilter(request, response);
}
日志记录过滤:
@Override
public 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 processing time: " + duration + "ms");
}
过滤器链
多个过滤器可以组成过滤器链,按照在web.xml中定义的顺序依次执行。每个过滤器的chain.doFilter()方法调用会将控制权传递给链中的下一个过滤器或目标Servlet。
注意事项
- 确保在
doFilter方法中调用chain.doFilter(),否则请求不会继续传递 - 对于异步请求处理,需要使用
AsyncContext进行特殊处理 - 过滤器可以配置
<dispatcher>元素来处理不同的请求类型(REQUEST, FORWARD, INCLUDE, ERROR) - 过滤器性能敏感,应避免在过滤器中执行耗时操作
通过合理使用过滤器,可以实现对Web应用请求和响应的统一处理,提高代码的可维护性和安全性。







