Listener监听器与Filter过滤器

1.Listener

    [1]监听器简介
        > Listener是JavaWeb的三大组件之一,Servlet、Filter、Listener
        > Listener翻译过来就是监听器
        > 现实生活中的监听器:
            - 监听谁:明星
            - 监听器:朝阳群众
            - 监听事件:干坏事
            - 回调函数:报警
 
        > JavaWeb中的监听器:
            - 监听谁:ServletContext、HttpSession、ServletRequest
            - 监听器:自己写
            - 监听的事件:生命周期、属性的变化
            - 回调函数:自己写
 
        > JavaWeb中的监听器,共分为三大类,一共8个:
 
        > WEB组件的特点:
            1.都需要创建一个类并实现某个接口
            2.都要在web.xml文件中进行配置
 
    [2]监听器分类   
        1.生命周期监听器(3个)
        2.属性变化监听器(3个)
        3.session中指定类属性变化监听器(2)
 
    [3]生命周期监听器:
        > 监听ServletContext、HttpSession、ServletRequest三个对象创建和销毁
 
        > javax.servlet.ServletContextListener --> 监听ServletContext的生命周期变化
            - 方法:
                void contextDestroyed(ServletContextEvent sce)
                    - 在ServletContext对象销毁前调用
 
                void contextInitialized(ServletContextEvent sce)
                    - 在ServletContext对象创建后调用
 
            - 参数:
                ServletContextEvent
                    - 可以用来获取ServletContext对象
 
        > javax.servlet.http.HttpSessionListener --> 监听HttpSession对象的生命周期变化
            - 方法:
                void sessionCreated(HttpSessionEvent se)
                    - 在HttpSession对象创建以后调用
 
                void sessionDestroyed(HttpSessionEvent se)
                    - 在HttpSession对象销毁前调用
 
            - 参数:
                HttpSessionEvent
                    - 可以用来获取HttpSession对象
 
        > javax.servlet.ServletRequestListener --> 监听request对象的生命周期的变化
            - 方法:
                void requestDestroyed(ServletRequestEvent sre)
                    - 在request对象销毁前调用
 
                void requestInitialized(ServletRequestEvent sre)
                    - 在request对象创建后调用
 
            - 参数:
                ServletRequestEvent
                    - 可以用来获取ServletContext对象
                    - 可以用来获取ServletRequest对象
 
    [4]属性监听器
        > ServletContext属性变化监听器
            javax.servlet.ServletContextAttributeListener
                - 方法:
                    void attributeAdded(ServletContextAttributeEvent scab)
                        - 当我们向application域中添加属性时调用
 
                    void attributeRemoved(ServletContextAttributeEvent scab)
                        - 当我们从application域中移除属性时调用
 
                    void attributeReplaced(ServletContextAttributeEvent scab)
                        - 当application域中一个属性被替换时调用
 
        > HttpSession的属性变化监听器
            javax.servlet.http.HttpSessionAttributeListener
                - 方法:
                    void attributeAdded(HttpSessionBindingEvent se)
                        - 当我们向session域中添加属性时调用
 
                    void attributeRemoved(HttpSessionBindingEvent se)
                        - 当我们从session中移除属性时调用
 
                    void attributeReplaced(HttpSessionBindingEvent se)
                        - 当session域中的一个属性被替换时调用
 
                参数:
                    HttpSessionBindingEvent:
                        作用:
                            1.获取发生变化的属性的名字 getName()
                            2.获取发生变化的属性的值 getValue() 注意属性替换时,获取到是旧的属性值
                            3.获取HttpSession对象 getSession() 可以通过session对象获取到新的属性值
 
        > ServletRequest属性变化监听器
            -javax.servlet.ServletRequestAttributeListener
                - 方法:
                    void attributeAdded(ServletRequestAttributeEvent srae)
                        - 当我们向request域中添加属性时调用
 
                    void attributeRemoved(ServletRequestAttributeEvent srae)
                        - 当我们从request域中移除属性时调用
 
                    void attributeReplaced(ServletRequestAttributeEvent srae)
                        - 当request域中的一个属性被替换时调用
 
 
    > 监听Session中指定类的实例属性变化的监听器
        - 这两个监听器的接口,由一个JavaBean去实现,而且不用编写配置文件
 
    [5]HttpSessionBindingListener
        void valueBound(HttpSessionBindingEvent event)
            - 当该类实例设置进session域中时调用
 
        void valueUnbound(HttpSessionBindingEvent event)
            - 当该类的实例从session域中移除时调用
 
        HttpSessionBindingEvent:
            作用:
                1.获取发生变化的属性的名字 getName()
                2.获取发生变化的属性的值 getValue()
                3.获取HttpSession对象 getSession()
 
    [6]HttpSessionActivationListener
        > 监听某个类的实例和session一起活化和钝化的监听器
        - 方法:
            void sessionDidActivate(HttpSessionEvent se)
                - 当该类实例和session一起活化时调用
 
            void sessionWillPassivate(HttpSessionEvent se)
                - 当该类实例和session一起钝化时调用
 
        - 参数:
            HttpSessionEvent
                - 可以用来获取HttpSession对象
 
 
2.Filter
    [1] Filter简介
        - Filter直译过来就是过滤器的意思
        - JavaWeb中的Filter是用来过滤请求
        - Filter是JavaWeb中三大组件之一:Servlet、Filter、Listener
        - 三大组件都需要运行在服务器端
        - 编写WEB组件有一个共同的特点:
            1.编写一个类实现某个接口
            2.在web.xml文件中进行配置
        - Filter的作用:
            1.过滤器可以在请求到达目标资源(JSP、HTML、Servlet等等)之前拦截请求
            2.过滤器也可以放行请求,使请求到达目标资源
            3.在响应到达浏览器之前对响应做一个处理
 
    [2] Filter的HelloWorld
        1.创建一个类实现Filter接口
        2.编写web.xml配置文件
            <filter>
                <filter-name>Filter的别名</filter-name>
                <filter-class>filter的全类名</filter-class>
            </filter>
            <filter-mapping>
                <filter-name>Filter的别名</filter-name>
                <url-pattern>要拦截的请求的地址</url-pattern>
            </filter-mapping>
 
        - url-pattern的配置规则:
            1.精确匹配:只有访问的路径和url-pattern配置的路径完全一致时,才会调用Filter拦截请求
                如: /index.jsp 只会拦截项目根目录下index.jsp的请求
 
            2.路径匹配:只要访问的地址在url-pattern配置的路径下,就会调用Filter拦截请求
                如: /hello/* 只要访问项目根目录下hello路径下的资源,就会调用Filter
                    /* 只要是当前项目下的请求都会调用Filter
 
            3.后缀匹配: 只要访问的地址后缀和url-pattern一致,就会调用Filter拦截请求
                如: *.jsp 只要访问的地址以.jsp结尾,就会调用Filter
 
            注意:所有的url-pattern必须符合上述规则。
                以上规则同样适用于Servlet的url-pattern
 
            当使用Filter去拦截一个Servlet时,只需要将Filter的url-pattern配置和Servlet的一样即可,
                同时也可以在filter-mapping中设置一个servlet-name标签,来指定要拦截的Servlet,
                    这样即使Servlet的url-pattern发生改变,Filter也会照常拦截
 
    [3] Filter的生命周期
        > Filter的生命周期是Filter由被创建到被销毁的过程
        > Filter的生命周期方法:
            构造器:服务器一启动就会创建Filter的实例,只会调用一次,Filter是单例。
 
            init(): 构造器调用之后,马上调用,用来初始化Filter,只会调用一次。
                FilterConfig:代表当前Filter的配置信息,可以获取当前Filter的初始化参数。
                                还可以获取ServletContext对象。
 
            doFilter():每次拦截请求时都会调用,会调用多次。
                ServletRequest:代表浏览器发送给服务器的请求报文,和Servlet中的request是一样的。
                ServletResponse:代表的是服务器响应给浏览器的响应报文,和Servlet中的response是一样的。
                FilterChain: 用来放行请求:
                    chain.doFilter(request,response) --> 放行请求,
                        当调用该方法时,相当于调用了目标资源的service方法。
 
            destroy():项目卸载Filter对象销毁前调用,用来做一些如释放资源等收尾的工作,只会调用一次。
 
    [4] Filter的执行顺序
        - 为同一个WEB资源可以设置多个Filter拦截请求,多个Filter就组成了一个Filter链。
            当有多个Filter时,在去调用chain.doFilter()时,
                如果Filter之后还有Filter,就相当于调用下一个Filter的doFilter方法
                如果Filter之后没有Filter,就相当于调用了目标资源的service()方法
 
        - 多个Filter的执行顺序,有filter-mapping的顺序决定,filter-mapping靠前的先拦截,靠后的后拦截。
        - 注意:filter-mapping一定要在filter标签的下边
 
    [5]  dispatcher
        - Filter默认只会拦截直接向目标资源发送的请求。
        - 我们可以在filter-mapping中通过dispatcher标签来指定拦截请求的类型:
            <dispatcher>REQUEST</dispatcher>
                - request表示会拦截直接向目标资源发送的请求,如果不配置dispatcher则默认值就是request
                    如果写了dispatcher则以写的为准
 
            <dispatcher>FORWARD</dispatcher>
                - forward表示会拦截通过转发向目标资源发送的请求
 
            <dispatcher>INCLUDE</dispatcher>
                - include表示会拦截通过动态包含向目标发送的请求
 
            <dispatcher>ERROR</dispatcher>
                - error表示会拦截通过错误页面的形式向目标发送的请求
                 <error-page>
                    <error-code>404</error-code>
                    <location>/4.jsp</location>
                  </error-page>
 
    [6] HttpFilter
 
  
 

转载请注明出处!

http://www.cnblogs.com/libingbin/

感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

转载于:https://www.cnblogs.com/libingbin/p/5985647.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mac】sublime text3标题栏显示文件完整路径

开发的兄弟对于sublime text一定不会陌生&#xff0c;目前在mac上使用这个软件遇到一个小问题&#xff0c;就是标题栏只显示了文件名&#xff0c;而不是文件全路径&#xff0c;所以当一个项目里同名的文件比较多的时候&#xff0c;就怕搞错文件。因此&#xff0c;我非常希望标题…

Error: listen EADDRINUSE: address already in use :::7197

vue启动项目报 Error: listen EADDRINUSE: address already in use :::7197 我是直接将项目的终端关闭&#xff0c;然后重新打开终端输入 npm run dev 就启动好了

SpringAPI手动创建代理对象——ProxyFactory

2019独角兽企业重金招聘Python工程师标准>>> 可以通过注解的方式来自定义代理对象的创建&#xff0c;同时也可以通过SpringAPI&#xff0c;手动编程的方式来创建代理对象。 几个重要的API&#xff1a; ProxyFactory\MethodInterceptor\Advice\AfterReturningAdvice\…

BZOJ2087 : [Poi2010]Sheep

一条边能连上当且仅当它没有经过任何点&#xff0c;并且两边的点都是偶数个。 枚举原点&#xff0c;通过极角排序求出哪些边是合法的&#xff0c;然后区间DP即可。 时间复杂度$O(nm\log mn^3)$。 #include<cstdio> #include<algorithm> const int N610,M20010; int…

快速学会开发微信小程序

From: https://www.cnblogs.com/juaner-hlj/p/6628148.html 1.手机&#xff08;微信-6.5.4以上&#xff09; 编辑器&#xff08;微信web开发 egret&#xff09; &#xff08;editplus sublime&#xff09; &#xff08;webstorm dw&#xff09; &#xff08;visio eclipse zen…

监听鼠标左右移动事件;所有dom事件列表

监听鼠标左右移动事件使用 mousemove 附带所有dom事件列表 <template><div><div>监听事件</div></div> </template><script> export default {data () {return {}},created () {// 定义鼠标事件处理函数document.addEventListener(…

关于Pac-Man,你所要了解的 一切

2019独角兽企业重金招聘Python工程师标准>>> 不论何时&#xff0c;它一直都是最伟大的游戏之一。这里有许多有关它的有趣的内幕&#xff1a;Pac-Man。 第一, 在一天之内重新创建Pac-Man 。 第二,对游戏种的每个鬼背后的人工智能的 一个非常详细的探讨 。 事实证明…

grunt入门 出处:http://artwl.cnblogs.com

grunt-contrib-uglify uglify是一个文件压缩插件&#xff0c;项目地址&#xff1a;https://github.com/gruntjs/grunt-contrib-uglify 本文将以一个DEMO来展示如何使用uglify插件。 DEMO环境 package.json: {"name": "grunt-demo","version": &q…

【推荐!!!】vue修改数据页面不更新;vue监听不到数据变化;vue打印有值页面无数据;this.$set ; this.$nextTick ; this.$forceUpdate

场景&#xff1a;vue是双向数据绑定的&#xff0c;那么在修改data数据时候&#xff0c;页面也应该是变化的&#xff0c;但是偶尔会遇到 1.vue修改数据页面不更新&#xff0c;既data数据变化了&#xff0c;但是页面渲染没变化。 2.或者vue监听不到数据变化&#xff1b; 3.vue打印…

探讨NDK编译错误ld.exe: Dwarf Error: mangled line number section.

如题所示的NDK编译错误是什么原因导致的&#xff1f;我的困惑今天在把WIN32下的一个工程移植到ANDROID时遇到上述错误&#xff0c;感到非常困惑。错误如下&#xff1a;D:/ndkr8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi…

Visual Studio Code之常备快捷键

From: https://blog.csdn.net/u010019717/article/details/50443970 孙广东 2015.12.31 官方快捷键大全&#xff1a;https://code.visualstudio.com/docs/customization/keybindings Visual Studio Code是个牛逼的编辑器&#xff0c;启动非常快&#xff0c;完全可以用来代替其…

jquery中cookie用法实例详解(获取,存储,删除等)

这篇文章主要介绍了jquery中cookie用法,结合实例详细分析了jQuery操作cookie的获取,存储,删除等操作,并附带了Jquery操作Cookie记录用户查询过信息实现方法,需要的朋友可以参考下本文实例讲述了jquery中cookie用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; cook…

js计算日期差;js计算天数差

场景&#xff1a;首先要注意两种情况 1.只是计算年月日的天数差&#xff0c;例如2022-10-10 12:00:00与 2022-10-11 00:00:00 相差1天 2.计算包含时分秒的天数差&#xff0c;例如2022-10-10 12:00:00与 2022-10-11 00:00:00 相差0天 3.注意safari浏览器 将时分秒的转化为时间戳…

非常全的VsCode快捷键

From: https://segmentfault.com/a/1190000007688656 常用 General 按 Press功能 FunctionCtrl Shift P&#xff0c;F1显示命令面板 Show Command PaletteCtrl P快速打开 Quick OpenCtrl Shift N新窗口/实例 New window/instanceCtrl Shift W关闭窗口/实例 Close wind…

Iptables-Fail2ban处理bind 非法***

早上发现DNS流量有些异常&#xff0c;查了query.log日志如下: 9-Apr-2013 13:49:33.418 queries: info: client 199.19.213.88#25345: view other_user: query: isc.org IN ANY ED (183.60.126.74) 09-Apr-2013 13:49:33.475 queries: info: client 199.19.213.88#25345: view …

通过挂载系统光盘搭建本地yum仓库的方法

1、配置本地yum源&#xff08;挂载光盘&#xff09; mkdir /medir/cdrom(创建目录) mount /dev/cdrom / medir/cdrom (挂载到/ medir/cdrom目录&#xff09; 2、修改yum配置文件 3. 修改挂载路径/ medir/cdrom&#xff0c; 将gpgcheck1改为0 enabled0改为1. 4. yum list …

谷歌划词翻译

谷歌划词翻译是个谷歌插件 复制及时翻译很好用 插件下载地址 配置谷歌翻译方法

[tp5] thinkPHP5-渲染模板的方式

From: https://blog.csdn.net/Wake_me_Up123/article/details/76096174 默认情况下&#xff0c;控制器的输出全部采用return的方式&#xff0c;无需进行任何的手动输出&#xff0c;系统会自动完成渲染内容的输出。 在控制器里渲染模板 namespace app\index\controller;use t…

.net 预编译 提示中导入的类型 冲突

之所以会出现你遇到的这个问题&#xff0c;是因为项目引用了自身的Dll文件&#xff0c;系统就把项目本身和项目本身生成的DLl文件看成两个项目来对待&#xff0c;因为它们两个本身就是对等的&#xff0c;就会出现冲突的问题。解决办法很简单&#xff0c;就是去掉项目对自身的引…

如何对Javascript代码进行二次压缩(混淆)

如何对Javascript代码进行二次压缩&#xff08;混淆&#xff09; 对Javascript代码进行压缩&#xff08;混淆&#xff09;&#xff0c;可以有效减少传输和加载时间。但是&#xff0c;不是所有的变量&#xff08;方法&#xff09;都能被混淆的&#xff0c;一般来说&#xff0c;只…