当前位置: 移动技术网 > IT编程>网页制作>CSS > Web基础了解版10-Filter-Listener

Web基础了解版10-Filter-Listener

2020年01月01日  | 移动技术网IT编程  | 我要评论

千千凝听,么么哒 新华字典,天外怪魔

filter

对于web应用来说,过滤器是一个驻留在服务器中的web组件,他可以截取客户端和web资源之间的请求和响应信息。

在一个web应用中可以部署多个过滤器,多个过滤器就组成了一个过滤器链,请求和响应必须在经过多个过滤器后才能到达目标

当配置多个filter以后就有一个执行顺序的问题,实际执行顺序是按照在web.xml文件中servlet-mapping的顺序决定的,如果顺序越靠前越先被调用。

filter接口

  • filter是一个接口。

  • filter是java web三大组件之一。(javaweb三大组件分别是:servlet小程序、filter过滤器、listener监听器)

  • 作用:1.检查用户访问权限

                2.设置请求响应编码,解决乱码问题

主要api

filter

  • init(filterconfig)方法用于初始化filter

  • dofilter(servletrequest,servletresponse,filterchain)作用和service()方法类似,是过滤请求和响应的主要方法。

  • destroy()用于在filter对象被销毁前做一些收尾工作。如:释放资源等。

filterconfig

filterconfig对象在服务器调用init()方法时传递进来。

  • getfiltername() 获取filter的名字

  • getservletcontext() 获取servletcontext对象(即application)

  • getinitparameter(string) 获取filter的初始化参数

  • getinitparameternames() 获取所有初始化参数的名字

filterchain

filterchain对象是在dofilter()方法被调用时作为参数传递进来的。

  • dofilter(servletrequest,servletresponse)方法用于调用filter链上的下一个过滤器,如果当前过滤器为最后一个过滤器则将请求发送到目标资源。

web.xml文件中的filter配置

<filter-mapping>
    <!-- filter的名字 -->
    <filter-name>filter1</filter-name>
    <!-- filter1的过滤地址,表示过滤http://127.0.0.1:8080/day17/admin/user.jsp-->
    <url-pattern>/admin/user.jsp</url-pattern>
</filter-mapping>

 

除此之外在filter-mapping还有一个子标签dispatcher,该标签用来指定需要filter处理的请求类型

<!-- 用户直接访问资源时,会调用filter -->
<dispatcher>request</dispatcher>

<!-- 通过转发访问时,会调用filter -->
<dispatcher>forward</dispatcher>

<!-- 通过动态包含获取时,会调用filter -->
<dispatcher>include</dispatcher>

<!-- 当通过异常处理访问页面时,会调用filter -->
<dispatcher>error</dispatcher>

 

这四种情况可以设置一个,也可以同时设置多个,如果不设置那么默认为request

filter生命周期

  1. 先执行filter的构造方法

  2. 然后执行filter的init()方法,对象创建后,马上就被调用,对filter做一些初始化操作

  3. 执行filter的dofilter()方法,每次访问目标资源,只要匹配过滤的地址,就会调用。

  4. 执行filter的destroy()方法,服务器停止时调用,用来释放资源。

filterconfig类

作用:

  • 获取filter在web.xml文件中配置的名称

  • 获取filter在web.xml文件中配置的初始化参数

  • 通过filterconfig类获取servletcontext对象实例

    // 获取filter的名称
    string filtername = filterconfig.getfiltername();// 获取初始化参数。username的值
    string username = filterconfig.getinitparameter("username");// 获取servletcontext的对象实例 
    servletcontext ctx = filterconfig.getservletcontext();

     

filterchain过滤器链

  • filterchain是整个filter过滤器的调用者。filter与filter之间的传递,或者filter与请求资源之间的传递都靠filterchain.dofilter方法。

  • 一般filter.dofilter中的代码分为三段:

    • 第一段是filterchain.dofilter之前的代码。一般用来做请求的拦截,检查用户访问的权限,访问日记的记录。参数编码的设置等等操作。

    • 第二段是filterchain.dofilter方法。此方法可以将代码的执行传递到下一个filter中。或者是传递到用户最终访问的资源中。

    • 第三段是filterchain.dofilter之后的代码。主要用过做一些日志操作。我们很少会在第三段中做太多复杂的操作。

  • 在每一个filter类的dofilter方法中,一定要调用chain.dofilter方法,除非你想要阻止用户继续往下面访问。否则一定要调用filterchain的dofilter方法。

filter的拦截路径

主要有以下两种

  • 第一种:通过filter-mapping的url-pattern来配置(与servlet的url-pattern的规则相同)

    • 精确匹配:/路径/资源名

      比如:/、/hello/index.jsp 、 /client/loginservlet 等,只有在请求地址完全一样时才会调用filter

    • 目录匹配:/路径名/*

      比如1:/abc/* 表示可以拦截abc目录下的所有资源,甚至是abc目录下的其他目录。

      比如2:/* 表示只要访问项目根目录下的资源就会调用filter

    • 后缀名匹配:*.后缀名

      比如:*.jsp 表示拦截所有后缀为jsp文件资源

  • 第二种:通过filter-mapping中的servlet-name来指定要过滤的servlet

在filter的filter-mapping中增加了一个servlet-name标签,将该标签的值设置成servlet的名字,在访问servlet时就会调用该过滤器过滤请求。
  <filter-mapping>
    <filter-name>hellofilter</filter-name>
    <servlet-name>helloservlet</servlet-name>
  </filter-mapping>

 

listener

listener用于监听javaweb程序中的事件,当事件被触发时,监听器中的指定方法将会被调用。

监听对象的创建与销毁

  • servletcontextlistener

    • 作用:监听servletcontext对象的创建与销毁

    • 方法:

      public void contextinitialized ( servletcontextevent sce ):servletcontext创建时调用

      public void contextdestroyed ( servletcontextevent sce ):servletcontext销毁时调用

    • servletcontextevent对象

      • 作用:public servletcontext getservletcontext ():获取servletcontext对象

  • httpsessionlistener

    • 作用:监听httpsession对象的创建与销毁

    • 方法:

      • public void sessioncreated ( httpsessionevent se ):httpsession对象创建时调用

      • public void sessiondestroyed ( httpsessionevent se ):httpsession对象销毁时调用

    • httpsessionevent对象

      • 作用:public httpsession getsession ():获取当前httpsession对象

  • servletrequestlistener

    • 作用:监听servletrequest对象的创建与销毁

    • 方法:

      • public void requestinitialized ( servletrequestevent sre ):servletrequest对象创建时调用

      • public void requestdestroyed ( servletrequestevent sre ):servletrequest对象销毁时调用

    • servletrequestevent对象

      • 作用:

        public servletrequest getservletrequest ():获取当前的servletrequest对象。

        public servletcontext getservletcontext ():获取当前项目的servletcontext对象。

三种创建与销毁的监听器使用起来基本一致。

在web.xml文件中注册监听器

<listener>
<listener-class>com.web.listener.myservletcontextlistener</listener-class>
</listener>

 

监听对象的属性变化

  • servletcontextattributelistener

    • 作用:监听servletcontext中属性的创建、修改和销毁

    • 方法:

      public void attributeadded(servletcontextattributeevent scab):向servletcontext中添加属性时调用

      public void attributeremoved(servletcontextattributeevent scab):从servletcontext中移除属性时调用

      public void attributereplaced(servletcontextattributeevent scab):当servletcontext中的属性被修改时调用

    • servletcontextattributeevent对象

      • 作用:

        public string getname() :获取修改或添加的属性名

        public object getvalue():获取被修改或添加的属性值

        public servletcontext getservletcontext ():获取当前web应用的servletcontext对象

  • httpsessionattributelistener

    • 作用:监听httpsession中属性的创建、修改和销毁

    • 方法:

      public void attributeadded ( httpsessionbindingevent se ):向httpsession中添加属性时调用

      public void attributeremoved(httpsessionbindingevent se):从httpsession中移除属性时调用

      public void attributereplaced(httpsessionbindingevent se):当httpsession中的属性被修改时调用

    • httpsessionbindingevent对象

      • 作用:

        public string getname() :获取修改或添加的属性名

        public object getvalue():获取被修改或添加的属性值

        public httpsession getsession ():获取当前的httpsession对象

  • servletrequestattributelistener

    • 作用:监听servletrequest中属性的创建、修改和销毁

    • 方法:

      public void attributeadded (servletrequestattributeevent srae ):向servletrequest中添加属性时调用

      public void attributeremoved(servletrequestattributeevent srae):从servletrequest中移除属性时调用

      public void attributereplaced(servletrequestattributeevent srae):当servletrequest中的属性被修改时调用

    • servletrequestattributeevent对象

      • 作用:

        public string getname():获取修改或添加的属性名

        public object getvalue():获取被修改或添加的属性值

        public servletrequest getservletrequest () :获取当前的servletrequest对象

监听session内的对象

  • httpsessionbindinglistener

    • 作用:监听某个对象在session域中的创建与移除。

    • 方法:

      public void valuebound(httpsessionbindingevent event):该类的实例被放到session域中时调用

      public void valueunbound(httpsessionbindingevent event):该类的实例从session中移除时调用

    • httpsessionbindingevent对象

      • 作用:

        public httpsession getsession ():获取httpsession对象

        public string getname():获取操作的属性名

        public object getvalue():获取操作的属性值

  • 使用:要监听哪一个类,直接使该类实现httpsessionbindinglistener接口即可。

  • httpsessionactivationlistener

    • 作用:监听某个对象在session中的序列化与反序列化。

    • 方法:

      public void sessionwillpassivate(httpsessionevent se):该类实例和session一起钝化到硬盘时调用

      public void sessiondidactivate(httpsessionevent se):该类实例和session一起活化到内存时调用

    • httpsessionevent对象

      • 作用:

        public httpsession getsession ():获取httpsession对象

  • 使用:要监听哪一个类,直接使该类实现httpsessionactivationlistener接口即可。

注意:为被监听类对象可以正常序列化到硬盘上,还需要让该类实现java.io.serializable接口

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网