Servlet-Filter

来源:互联网 发布:淘宝元旦有活动吗 编辑:程序博客网 时间:2024/05/16 19:12

 一.概念

     Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

    WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

二.过滤流程


三.特点

1.Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器

2.Servlet过滤器可以被串联在一起,形成过滤链,协同修改请求和响应对象。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter

3.过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题

四.作用

  1. 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。 
  2. 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。 
  3. 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。 
  4. 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。拦截过程

五.拦截实现过程

Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

  1. 调用目标资源之前,让一段代码执行。
  2. 是否调用目标资源(即是否让用户访问web资源)。
  3. 调用目标资源之后,让一段代码执行。

  web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。

六.适用场合

  1. 认证过滤
  2. 登录和审核过滤
  3. 图像转换过滤 
  4. 数据压缩过滤 
  5. 加密过滤 
  6. 令牌过滤 
  7. 资源访问触发事件过滤 
  8. XSL/T过滤 
  9. Mime-type过滤

七.生命周期

7.1、Filter的创建

  Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

7.2、Filter的执行

过滤器实例调用doFilter方法,根据初始化参数的值判断该请求是否合法,由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,所以其中所用到的请求、响应对象ServletRequest、ServletResponse在使用前都必须先转换成HttpServletRequest、HttpServletResponse再进行下一步操作

7.3、Filter的销毁

Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

7.4、FilterConfig接口

  用户在配置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上下文对象的引用。

<span style="font-size:14px;">package test;import java.io.IOException;import java.util.Enumeration;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class FilterDemo02 implements Filter {    /* 过滤器初始化     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)     */    @Override    public void init(FilterConfig filterConfig) throws ServletException {               //得到过滤器的名字        String filterName = filterConfig.getFilterName();        //得到在web.xml文件中配置的初始化参数        String initParam1 = filterConfig.getInitParameter("xxx");        //返回过滤器的所有初始化参数的名字的枚举集合。        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();                System.out.println(filterName);        System.out.println(initParam1);        while (initParameterNames.hasMoreElements()) {            String paramName = (String) initParameterNames.nextElement();            System.out.println(paramName);        }    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("FilterDemo02执行前!!!");        chain.doFilter(request, response);  //让目标资源执行,放行        System.out.println("FilterDemo02执行后!!!");    }    @Override    public void destroy() {        System.out.println("----过滤器销毁----");    }}</span>


八.Filter的部署

以官方自带的字符编码过滤器为例
 <!-- 配置字符编码过滤器 --><filter>   <filter-name>characterEncodingFilter</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>     <param-value>true</param-value>   </init-param></filter><filter-mapping>  <filter-name>characterEncodingFilter</filter-name>  <url-pattern>/*</url-pattern></filter-mapping>



0 0
原创粉丝点击