JavaWeb servlet过滤器

  一.Filter简介:

***************************************************************************************

    Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件

或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理。使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将请求交给Servlet 进行处

理并生成响应,最后Filter 再对服务器响应进行后处理。

  二、Servlet过滤器的特点:

  ***************************************************************************************

    1.Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象

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

    3.Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象

  三、Servlet过滤器的适用场合:
  ***************************************************************************************
    1.认证过滤

    2.登录和审核过滤

    3.图像转换过滤 

    4.数据压缩过滤 

    5.加密过滤 

    6.令牌过滤 

    7.资源访问触发事件过滤 

    8.XSL/T过滤 

    9.Mime-type过滤

  四、Servlet过滤器接口的构成:

  ***************************************************************************************

     所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:

    1.init(FilterConfig):

     这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数

    2.doFilter(ServletRequest,ServletResponse,FilterChain):

     这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器

    3.destroy():

     Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源

  五、Servlet过滤器的创建步骤:
  ***************************************************************************************
    1.实现javax.servlet.Filter接口

    2.实现init方法,读取过滤器的初始化函数

    3.实现doFilter方法,完成对请求或过滤的响应

    4.调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应

    5.销毁过滤器

  六、Servlet过滤器的发布:
  ***************************************************************************************

    1.发布Servlet过滤器时,必须在web.xml文件中加入<filter>元素和<filter-mapping>元素。

    2.<filter>元素用来定义一个过滤器:

    属性                   含义

      filter-name    指定过滤器的名字

      filter-class    指定过滤器的类名

      init-param    为过滤器实例提供初始化参数,可以有多个

    3.<filter-mapping>元素用于将过滤器和URL关联:

      属性                     含义

      filter-name    指定过滤器的名字

      url-pattern    指定和过滤器关联的URL,为”/*”表示所有URL

public class LoginFilter implements Filter {

    private String urlPath;// 用来存放不需要判断的页面路径

    public LoginFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        String[] urls = urlPath.split(",");
        for (String s : urls) {
            String reqPath = request.getRequestURI();
            if (reqPath.indexOf(s) != -1) {
                chain.doFilter(request, response);
                return;
            }
        }
        Object obj = request.getSession().getAttribute("currentUser");
        if (obj == null) {
            response.sendRedirect("login.jsp");
        } else {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
        urlPath = fConfig.getInitParameter("initPath");
    }

}
原文地址:https://www.cnblogs.com/bekeyuan123/p/7082716.html