1.Filter前言
Servlet过滤器----Filter可以动态地拦截请求和响应,在客户端访问后台资源前、在服务器响应发送回客户端前,都可以先使用过滤器。过滤器相当于给servlet加了一把锁,在servlet处理前,过滤掉一些不在考虑范围之内的东西。
web.xml中元素执行的顺序listener->filter->struts拦截器->servlet。
过滤器的概念:
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题
2.Filter类型
Servlet过滤器种类:
身份验证过滤器(AuthenticationFilters)。
数据压缩过滤器(Datacompression Filters)。
加密过滤器(EncryptionFilters)。
触发资源访问事件过滤器。
图像转换过滤器(ImageConversion Filters)。
日志记录和审核过滤器(Loggingand Auditing Filters)。
MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
标记化过滤器(TokenizingFilters)。
XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
3.Filters使用方法
Servlet过滤器实现了java扩展包中javax.servlet.filter接口,还要在web.xml中进行配置。javax是java的扩展包它定义了三个方法:
一:public void doFilter(ServletRequest, ServletResponse, FilterChain)
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
二:public voidinit(FilterConfig filterConfig)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
三:public void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。
4.Filter运行过程:
个人理解是这样的,我们把程序《drp》部署到Tomcate,当客户端发起请求时,Tomcate会根据请求的URL地址(并且携带请求数据)去部署的《drp》项目中找匹配的地址。但是在这中间当Tomcate找到WEB-INF时会先去检查下它的XML配置文件,看一下有什么需要注意的和路径映射关系。Filter要求写在servlet和映射关系之前,当Tomcate发现存在Filter时就会解析Filter的路径找到Filter类,根据Filter设置的匹配条件将符合条件的客户端请求通过doFilter()方法放到Fliter类中,再通过Filter类中的doFilter进行下一次跳转或者最终通过过滤器限制,进入请求地址。
5.王勇老师的实例
例子:通过添加用户功能增加字符集设置。
一 : 编写CharsetEncodingFilter过滤器类,需要实现javax.Servlet.filter类的接口。
package com.bjpowernode.drp1.util.filter;
import java.io.IOException;
//filter类实现javac.servlet.filter接口后加载的jar包
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 采用filter统一处理字符集
* @author F-mdh
*
*/
public classCharsetEncodingFilter implements Filter {
//CharsetEncodingFilter实现Filter接口后,会自动加载filter的三个方法:destory();dofilter();init();
//设置的字符集endcoding
private String endcoding;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequestrequest, ServletResponse response,
FilterChainchain) throwsIOException, ServletException {
//设置字符集:往请求数据中加上字符集
request.setCharacterEncoding(endcoding);
//继续执行:继续进行跳转
chain.doFilter(request,response);
}
@Override
public void init(FilterConfigfilterConfig) throwsServletException {
this.endcoding =filterConfig.getInitParameter("encoding");
}
}
二:配置WEB-INF的XML文件,增加Filter过滤器类名、地址、匹配条件。
<?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 配置filter的类和类的地址 -->
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp1.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<!-- 配置filter的作用范围【扩展匹配】 -->
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
6.知识补充
Web.xml配置节点说明:
<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
Filter可以看成一种横切性技术,和AOP都是面向切面编程。(终于对面向切面编程有一丝理解~~~AOP啊)。
Filter只对Post请求起作用,Post请求将请求地址放在了URL中,和Request一起。
Filter其实对Request和Response请求进行了拦截。