为什么80%的码农都做不了架构师?>>>
一 生命周期
方法声明 | 功能描述 |
init(FilterConfig filterConfig) | 用于初始化过滤器,整个生命周期中只被调用一次 |
doFilter(ServletRequest req, ServletResponse resp) | 拦截处理方法 |
destroy() | 卸载Filter之前调用,整个生命周期中只被调用一次 |
二 实现
1.实现Filter接口,重写生命周期方法。
2.doFilter中放行资源
filterChain.doFilter(servletRequest, servletResponse);
3.web.xml中配置<filter>和<fileter-mapping>
<filter> <filter-name>Filter01</filter-name> <filter-class>com.cary.demo.Filter01</filter-class> </filter> <filter-mapping> <filter-name>Filter01</filter-name> <url-pattern>/filter01</url-pattern> </filter-mapping>
三 请求拦截
1.可以在<url-pattern>中使用“*”通配符拦截所有的请求访问。
2.<dispatcher>拦截
- REQUEST:如果资源是通过RequestDispatcher的incloude()和forward()访问的,那么该过滤器不会被拦截,否则被拦截。
- INCLUCE:通过RequestDispatcher的include访问的,会调用该拦截器,被拦截。
- FORWARD:通过RequestDispatcher的forward访问的,会调用该拦截器,被拦截。
- ERROR:如果是通过声明是异常机制访问的,会调用该拦截器,被拦截。
四 Filter链
Filter01:
public class Filter01 implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Filter01"); filterChain.doFilter(servletRequest, servletResponse);//将请求传递给Filter02 } }
Filter02:
public class Filter02 implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Filter02"); } }
<filter> <filter-name>Filter01</filter-name> <filter-class>com.cary.demo.Filter01</filter-class> </filter> <filter-mapping> <filter-name>Filter01</filter-name> <url-pattern>/filter01</url-pattern> </filter-mapping> <filter> <filter-name>Filter02</filter-name> <filter-class>com.cary.demo.Filter01</filter-class> </filter> <filter-mapping> <filter-name>Filter02</filter-name> <url-pattern>/filter02</url-pattern> </filter-mapping>
注:Filter的拦截顺序与它们在web.xml文件总<filter-mapping>元素的映射顺序一致。上例中Filter01在前,因此Filter01先拦截请求。
五 FilterConfig
方法声明 | 功能描述 |
String getFilterName() | 返回web.xml中Filter设置的名称 |
ServletContext getServletContext() | 返回ServletContext对象 |
String getInitParameter(String name) | 获取web.xml中<init-param>中设置的参数值 |
Enumeration getInitParameterNames() | 返回<init-param>Enumeration集合,包含所有初始化参数的名称 |