过滤器
Filter是在Servlet3.2之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源时,即可以使用过滤器完成。
过滤器是以一种组件的形式绑定到Web应用程序中的,与其他Web应用程序组件不同的是,过滤器是采用“链”的方式进行处理的。
过滤器的操作原理
实现过滤器
定义一个过滤器实现javax.servlet.Filter接口。接口中的方法如下:
//初始化过滤器(容器启动时初始化),通过FilterConfig取得配置的初始化参数。 public void init(FilterConfig filterConfig) throws ServletException //完成具体的过滤操作,然后通过FilterChain 让请求继续向下传递 public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException ,ServletException //过滤器销毁使用 public void destroy()
需要注意的是doFilter()方法,此方法定义了ServletRequest、ServletResponse和FilterChain 3个参数,从前两个参数可以发现,过滤器可以完成对任意协议的过滤操作。FilterChain接口的主要作用是将用户的请求向下传递给其他的过滤器或者Servlet。此接口的方法如下:
public void doFilter(ServletRequest request ,ServletResponse response) throws IOException,ServletException
在FilterChain接口中依然定义了一个doFilter()方法,这是因为在一个过滤器后面可能存在另外一个过滤器,也可能是请求的最终目标(Servlet),这样通过FilterChan形成了一个“过滤链”的操作。
在Web.xml文件中的配置如下
<filter> <filter-name>MyFilter</filter-name> <filter-class>com.ghq.myservlet.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
过滤器的配置与Servlet的配置样式非常相似,但需要注意的是<url-pattern>表示一个过滤器的过滤位置,“/*”表示对于根目录下的一切操作都需要过滤。
过滤器中的初始化方法是在容器启动时自动加载的,并且通过FilterConfig的getInitParameter()方法取出了配置的初始化参数,只初始化一次,但是对于过滤器中的doFilter()方法实际上会调用两次,一次是在FilterChain操作之前,一次是在FilterChain操作之后。
过滤器的应用
编码过滤
例如SpringMVC解决post请求中请求参数值可能出现乱码的情况使用过滤器。
<filter> <filter-name>characterEncoding</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> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>