JavaWeb Filter浅析
1、Filter简介
Filter,过滤器,用于在servlet之外对request 和response 进行修改。Filter 有一个 FilterChain 的概念,一个FilterChain 包括多个 Filter。客户端请求 request在抵达servlet 之前,会经过 FilterChain 里面所有的 Filter,服务器响应 response 从servlet抵达客户端浏览器之前也会经过 FilterChain 里面所有的 Filter 。
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
以下是一张经典的过滤器链示意图:

2、Filter应用场景
Filter一般用于:登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换、压缩响应信息等操作,便于代码重用,不必每个servlet中还要进行相应的操作。
3、Filter实现步骤
自定义一个Filter需要实现以下操作:
a.创建一个类实现javax.servlet.Filter接口;
b.实现doFilter()方法;
c.配置
4、Filter实例
以下是一个简单的filter demo
@WebFilter(urlPatterns = "/myServlet2", initParams = {@WebInitParam(name = "username", value = "MyFilter")})
public class MyFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("---------doFilter-----------");
System.out.println(req.getServletContext().getInitParameter("username"));
resp.getWriter().println("---------doFilter-----------");
chain.doFilter(req, resp);
System.out.println("---------doFilter------over-----");
}
//filter初始化方法,通过FilterConfig可以获取到filter配置的初始化参数
public void init(FilterConfig config) throws ServletException {
Enumeration<String> parameters = config.getInitParameterNames();
while (parameters.hasMoreElements()) {
String element = parameters.nextElement();
System.out.println(element + " = " + config.getInitParameter(element));
}
}
}
可以看到,filter是在容器启动的时候就初始化的。



5、Filter应用举例
5.1、设置字符编码集
@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*")
public class PrivateFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("gbk");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
5.2、权限校验
@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*")
public class PrivateFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
String username = (String) req.getParameter("username");
if (!"张三".equals(username)) {
resp.getWriter().println("--------权限不足,无法访问---------");
return;
}
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}


浙公网安备 33010602011771号