过滤器是JavaWeb三大组件之一,是用来过滤用户请求的
Filter
Filter过滤器是JavaWeb三大组件之一,是用来过滤用户请求的,包括JSP、Servlet和静态资源等,可以实现敏感的字符串过滤、避免中文乱码、权限验证、禁用浏览器缓存、实现自动登录、统计网站访问次数、生成静态页面等。12
实现Filter
实现javax.servlet.Filter接口,重写doFilter方法,init和destroy方法有default实现,按需重写。
Filter配置
-
web.xml配置
<!--过滤器配置--> <filter> <filter-name>FirstFilter</filter-name> <filter-class>com.ldy.filter.FirstFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>path</param-name> <param-value>F:\Study</param-value> </init-param> </filter> <filter-mapping> <filter-name>FirstFilter</filter-name> <!--拦截所有--> <!--<url-pattern>/*</url-pattern>--> <!--拦截指定jsp--> <!--<url-pattern>/index.jsp</url-pattern> <url-pattern>/list.jsp</url-pattern>--> <!-- 拦截所有jsp--> <!--<url-pattern>*.jsp</url-pattern>--> <!--根据servlet的内部名称拦截--> <servlet-name>AnnotationServlet</servlet-name> <!--拦截指定的servlet--> <!--<url-pattern>/index</url-pattern>--> <!--拦截直接访问的请求或者重定向的资源--> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <!--Filter配置多个url-pattern--> <filter-mapping> <filter-name>FirstFilter</filter-name> <!--@WebServlet默认名称为类的全限定名称--> <servlet-name>com.ldy.servlet.AdminServlet</servlet-name> </filter-mapping>
-
注解配置
@WebFilter( filterName = "AnnotationFilter", urlPatterns = "*.html", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}, initParams = { @WebInitParam(name = "name", value = "ldy"), @WebInitParam(name = "age", value = "25") })
过滤器执行顺序:web.xml中配置Filter的先后顺序的,如果放在前面就先执行,放在后面就后执行;注解方式配置,就比较urlPatterns的字符串优先级。
-
目标资源拦截类型dispatcher
-
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。
- INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。
- FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用。
- ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。
-
过滤器执行顺序:web.xml中配置Filter的先后顺序的,如果放在前面就先执行,放在后面就后执行;注解方式配置,就比较urlPatterns的字符串优先级。
生命周期
- init,初始化阶段,创建完Filter对象时调用,只调用一次
- doFilter,处理客户端请求阶段,每次发出匹配url-pattern请求时调用,如果需要继续访问目标资源则调用FilterChain的doFilter(ServletRequest,ServletResponse)方法
- destroy,终止阶段,停止服务器时销毁Filter对象,只调用一次
FilterConfig
Filter接口中init()方法的参数类型为FilterConfig类型,功能类似ServletConfig,对应web.xml中元素,主要是用于加载Filter的初始化参数。
包含getServletContext()、getFilterName()、getInitParameter(String name)、getInitParameterNames()等方法。
FilterChain
Filter接口中doFilter()方法的参数之一为FilterChain,只包含doFilter(ServletRequest,ServletResponse)方法,链式调用。
如果当前过滤器是最后一个过滤器,那么调用chain.doFilter()方法表示执行目标资源;如果是最后一个过滤器,那么chain.doFilter()表示执行下一个过滤器的doFilter()方法。