Filter,过滤器,用于在servlet以外对request 和response 进行修改。Filter 有一个 FilterChain 的概念,一个FilterChain 包括多个 Filter。客户端请求 request在抵达servlet 以前,会通过 FilterChain 里面全部的 Filter,服务器响应 response 从servlet抵达客户端浏览器以前也会通过 FilterChain 里面全部的 Filter 。java
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件以前,经过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也能够对响应进行过滤,拦截或修改响应。
如下是一张经典的过滤器链示意图:浏览器
Filter通常用于:登陆权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换、压缩响应信息等操做,便于代码重用,没必要每一个servlet中还要进行相应的操做。服务器
自定义一个Filter须要实现如下操做:编码
a.建立一个类实现javax.servlet.Filter接口;url
b.实现doFilter()方法;code
c.配置blog
如下是一个简单的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是在容器启动的时候就初始化的。utf-8
@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 { } }
@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 { } }