一、Filter(即过滤器)的功能
主要对用户请求进行预处理和后处理,主要功能有两个:
1.预处理:在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
2.后处理:在HttpServletRequest到达客户端之前,拦截HttpServletRequest,根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
二、Filter开发步骤
1.编写java类实现Filter接口,并实现其doFilter方法
注意,Filter接口中有三个方法init(FilterConfig filterConfig)、destory()和doFilter(ServletRequest request,ServlterResponse response,FilterChain chain),在编写其实现类的时候,所有的方法必须要全部实现
2.在web.xml中对编写的Filter类进行注册,并设置它所能拦截的资源
-----------------------------------------------------------------------我是分界线--------------------------------------------------------------------
在web.xml文件中的配置以及详细的注释说明:
<!--在web.xml中配置过滤器--> <filter><!--指定一个过滤器--> <!--为过滤器指定一个名字,该内容不能为空--> <filter-name>FilterDemo</filter-name> <!--指定过滤器的完整的限定类名--> <filter-class>lm.practice.FilterDemo</filter-class> <!--为过滤器指定初始化参数--> <init-param> <!--参数名--> <param-name>logonStrings</param-name><!-- 对登录页面不进行过滤 --> <!--参数值--> <param-value>/project/index.jsp;login.do</param-value> </init-param> </filter> <!--用于设置一个 Filter 所负责拦截的资源。 一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径--> <filter-mapping> <!--用于设置filter的注册名称,该值要跟过滤器名一致--> <filter-name>FilterDemo</filter-name> <!--设置 filter 所拦截的请求路径(过滤器关联的URL样式)--> <url-pattern>/*</url-pattern> <!--指定过滤器所拦截的Servlet名称--> <servlet-name>Log4jTestServlet</servlet-name> <!--指定过滤器所拦截的资源被 Servlet 容器调用的方式, Error表示目标资源是通过声明式异常处理机制调用时,该过滤器会被调用--> <dispatcher>ERROR</dispatcher> </filter-mapping>
其中,dispatcher还可以是以下的值:
(1)REQUEST:当用户直接访问页面时,会调用过滤器,如果目标资源是通过RequeDispatcher的include方法或forward方法访问时,不会被调用。
(2)INCLUDE:如果目标资源是通过RequeDispatcher的include方法访问时,过滤器被调用
(3)FORWARD:如果目标资源是通过RequeDispatcher的forward方法访问时,过滤器被调用
(4)ERROR:表示目标资源是通过声明式异常处理机制调用时,过滤器被调用
三、Filter链
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
四、Filter的生命周期Filter中有三个重要的也是必须实现的方法init(FilterConfig filterConfig)、destory()和doFilter(ServletRequest request,ServlterResponse response,FilterChain chain),分别表示初始化、拦截请求到销毁这样一个过程,也是一个Filter的生命周期
另外附一个防止乱码发生的Filter在web.xml中的配置:
<filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name><!--用来指定一个具体的字符集--> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name><!--true:无论request是否指定了字符集,都是用encoding;false:如果request已指定一个字符集,则不使用encoding--> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>