Filter
Filter意为滤镜或者过滤器,用于在Servlet之外对request或者response进行修改。Filter提出了滤镜链的概念,客户端请求request在抵达Servlet之前会经过FilterChain里面的所有Filter,服务器响应response在从Servlet到达客户端之前也会经过FilterChain里面的所有Filter。其辱李过程如图:
一个Filter必须实现javax.servlet.Filter接口。其有三个方法。
- void init(FilterConfig)创建之后,马上执行;Filter会在服务器启动时就创建!
- void destory()销毁之前执行!在服务器关闭时销毁
- void doFilter(ServletRequest,ServletResponse,FilterChain) 每次过滤时都会执行
其中init()和destroy()方法只会被调用一次,分别在Web程序加载或者卸载的时候调用,而doFilter()方法每次有客户端请求都会都会被调用一次,Filter的所有工作都集中在doFilter()中
由此,Filter可以完成的工作:
- 在执行Servlet之前,首先执行Filter程序,并为之做一些预处理工作
- 根据程序需要修改请求与响应
- 在Servllet执行之后 截获Servlet的执行
Filter的开发主要分为2步:
- 编写java类实现Filter接口,并实现其doFilter方法。
- 在web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
public class CharacterEncodingFilter implements Filter{ //编写CharacterEncodingFilter类
protected String encoding ="";
//在过滤器中 设置的字符编码为encoding
public void destroy() {
encoding=null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(encoding==null){
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding=filterConfig.getInitParameter("encoding");
}
}
在web.xml中配置过滤器:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping
FilterConfig接口
其与ServletConfig类似
用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了
filter初始化参数的filterConfig对象传递进来。因此在编写filter时,通过filterConfig对象的方法,就可获得:
- String getFilterName():得到filter的名称。
- String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
- Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
- public ServletContext getServletContext():返回Servlet上下文对象的引用。
过滤器的四种拦截方式
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。- <dispatcher>REQUEST</dispatcher>
- <dispatcher>FORWARD</dispatcher>
- <dispatcher>INCLUDE</dispatcher>
- <dispatcher>ERROR</dispatcher>
这些可以在<filter-mapping>中进行配置!
<dispatcher> 子元素可以设置的值及其意义:
- REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
- INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
- FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
- ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。