zoukankan      html  css  js  c++  java
  • Java Filter过滤器的简单总结

    Java Filter过滤器的简单总结

    1.Filter的介绍

    Filter技术是servlet 2.3新增加的功能。它能够对Servlet容器的请求和响应对象进行检查和修改。

    Filter本身并不生成请求和响应对象,只是提供过滤功能。

    Filter能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response的内容。

    Filter可以过滤的Web组件包括Servlet,JSP和HTML等文件。

    2.Filter的工作原理

            当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。

            两个过滤器同时过滤一个请求时,就要用到过滤链FilterChain。Filter的FilterChain中,服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。执行的顺序就如下图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。

            Filter的执行流程就是:执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>……——>第n个过滤器的chain.doFilter()之前的代码——>所请求servlet的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。

    3.Filter生命周期的四个阶段

    (1)实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。

    (2)初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。

    (3)过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。

    (4)销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。

    4.Filter的API

    public Interface Filter
    所有的过滤器都必须实现Filter接口。该接口定义了init,doFilter0,destory()三个方法:


      (1) public void init (FilterConfig filterConfig) 
    当开始使用servlet过滤器服务时,Web容器调用此方法一次,为服务准备过滤器;然后在需要使用过滤器的时候调用doFilter(),传送给此方法的FilterConfig对象,包含servlet过滤器的初始化参数。

    示例:

    Filter的init方法中提供了一个FilterConfig对象,提供相关的操作:

    如获取Filter中配置的初始化参数:
    1
    2
    3
    4
    5
    6
    7
    8
    <filter>
          <filter-name>LoginFilter</filter-name>
          <filter-class>com.itzhai.login.LoginFilter</filter-class>
          <init-param>
              <param-name>username</param-name>
              <param-value>HelloWorld</param-value>
          </init-param>
    </filter>

    在init方法中获取:

     
    1
    2
    3
    4
    5
    6
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
     {
        //获取Filter初始化参数
        String username = filterConfig.getInitParameter("username");
    }

      (2)public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)    
             每个过滤器都接受当前的请求和响应,且FilterChain过滤器链中的过滤器(应该都是符合条件的)都会被执行。doFilter方 法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。过滤器通过传送至 此方法的FilterChain参数,调用chain.doFilterO将控制权传送给下一个过滤器。当这个调用返回后,过滤器可以在它的 Filter方法的最后对响应做些其他的工作。如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤 器,而将其重定向至其它一些页面。当链中的最后一个过滤器调用chain.doFilterO方法时,将运行最初请求的Servlet。

     (3)public void destroy()
           一旦doFilterO方法里的所有线程退出或已超时,容器调用此方法。服务器调用destoryO以指出过滤器已结束服务,用于释放过滤器占用的资源。

    5.例子

    过滤敏感词汇实例一:

     
     
     
     
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    package com.zhouyu.filter;
     
    import java.io.IOException;
     
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    public class FilterTest implements Filter
    {
     
        @Override
        public void destroy()
        {
            // TODO Auto-generated method stub
        }
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
        {
            // 转换成实例的请求和响应对象
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            // 获取评论并屏蔽关键字
            String str = req.getParameter("str");
            str = str.replace("你妹呀""***");
            // 重新设置参数
            req.setAttribute("str", str);
            // 继续执行
            chain.doFilter(request, response);
        }
     
        @Override
        public void init(FilterConfig filterConfig) throws ServletException
        {
            // TODO Auto-generated method stub
     
        }
    }

    package com.bjsxt.filter;
    import java.io.IOException;
    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 Filter1 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {System.out.println("Filter1.init()");}
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterchain) throws IOException, ServletException {System.out.println("Filter1.doFilter(预处理)");//放行filterchain.doFilter(request, response);System.out.println("Filter1.doFilter(后处理)");}

    public void destroy() {}}

  • 相关阅读:
    PAT 甲级 1115 Counting Nodes in a BST (30 分)
    PAT 甲级 1114 Family Property (25 分)
    PAT 甲级 1114 Family Property (25 分)
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
  • 原文地址:https://www.cnblogs.com/zzuzhenlei/p/7148580.html
Copyright © 2011-2022 走看看