Filter部分初步理解

一、Filter的基本工作原理

1、Filter程序是一个实现了特殊接口的Java类,与Servlet类似,也是由Servlet容器进行调用和执行的。

2、当在web.xml注册了一个Filter来对某个Servlet程序进行拦截处理时,它可以决定是否将请求继续传递给Servlet程序,以及对请求和响应消息是否进行修改。

3、当Servlet容器开始调用某个Servlet程序时,如果发现已经注册了一个Filter程序来对该Servlet进行拦截,那么容器不再直接调用Servlet的service方法,而是调用Filter的doFilter方法,再由doFilter方法决定是否去激活service方法。

4、但在Filter.doFilter方法中不能直接调用Servlet的service方法,而是调用FilterChain.doFilter方法来激活目标Servlet的service方法,FilterChain对象时通过Filter.doFilter方法的参数传递进来的。

5、只要在Filter.doFilter方法中调用FilterChain.doFilter方法的语句前后增加某些程序代码,这样就可以在Servlet进行响应前后实现某些特殊功能。

6、如果在Filter.doFilter方法中没有调用FilterChain.doFilter方法,则目标Servlet的service方法不会被执行,这样通过Filter就可以阻止某些非法的访问请求。

二、Filter接口

一个Filter程序就是一个Java类,这个类必须实现Filter接口。javax.servlet.Filter接口中定义了三个方法:init、doFilter、destory。

1、init方法

(1)、在Web应用程序启动时,Web服务器(Web容器)将根据其web.xml文件的配置信息来创建每个注册的Filter的实例对象,并将其保存在内存中。

(2)、Web容器创建Filter的实例对象后,将立即调用该Filter对象的init方法。init方法在Filter生命周期中仅被执行一次,Web容器在调用init方法时,会传递一个包含Filter的配置和运行环境信息的FilterConfig对象

 

(3)开发人员可以在init方法中完成与构造方法类似的初始化功能,要注意的是:如果初始化代码要使用到FilterConfig对象,这些代码只能在init方法中编写,而不能在构造方法中编写(尚未调用init方法,即并没有创建FilterConfig对象,要使用它则必然出错)。

2、doFilter方法

当一个Filter对象能够拦截访问请求时,Servlet容器将调用Filter对象的doFilter方法。

其中,参数request和response为Web容器或Filter链中上一个Filter传递过来的请求和响应对象;参数chain为代表当前Filter链的对象

3、destroy方法

该方法在Web容器卸载Filter对象之前被调用,也仅执行一次。可以完成与init方法相反的功能,释放被该Filter对象打开的资源,例如:关闭数据库连接和IO流。

案例代码

web.xml

<filter>
    <filter-name>PrivFilter</filter-name>
    <filter-class>util.PrivFilter</filter-class>
    
    <init-param>
        <param-name>cookieName</param-name>
        <param-value>ssocookie</param-value>
    </init-param>
     <init-param>
        <param-name>SSOServiceURL</param-name>
        <param-value>http://localhost:8080/CAS/checkCookie.do</param-value>
    </init-param>
     <init-param>
        <param-name>SSOServiceURL</param-name>
        <param-value>http://localhost:8080/CAS/login.html</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>PrivFilter</filter-name>
    <url-pattern>*.html</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>PrivFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

PrivFilter.java

private FilterConfig filterConfig = null;
       static private String cookieName;
       static private String SSOServiceURL;//验证url
      static private String SSOLoginPage;//登陆url

      public void init(FilterConfig filterConfig) {

            this.filterConfig = filterConfig;
            if (filterConfig != null) {
                
                   System.out.println("SSOFilter:Initializing filter");
                
            }       
            cookieName = filterConfig.getInitParameter("cookieName");
            SSOServiceURL = filterConfig.getInitParameter("SSOServiceURL");
            SSOLoginPage = filterConfig.getInitParameter("SSOLoginPage");
        } 

猜你喜欢

转载自blog.csdn.net/weixin_36448423/article/details/81104430
今日推荐