拉钩教育-Filter+Listener技术

作者:神秘网友 发布时间:2020-09-14 11:54:33

拉钩教育-Filter+Listener技术

拉钩教育-Filter+Listener技术

一、Filter过滤器

Filter就是我们的过滤器,它存在于浏览器和服务器之间,以前我们浏览器发送请求时,会直接发送至服务器,而现在不同了,浏览器发送请求要发送给filter,filter来判断你是不是有资格请求我的资源,有点看门大爷的意思了,大爷认证通过你的身份后呢,就会给你指路,告诉你要访问的资源在哪,等你获取了响应后往大门走,还会路过大爷,大爷也会检查检查你,看看有没有带什么不该带的出去,检查通过了,响应才会传至浏览器,如下图所示:

拉钩教育-Filter+Listener技术

想要拥有我们的同款大爷,需要以下操作:

1、自定义类实现Filter接口

相当于去保安队招一个门卫来,注意认准保安大队的名称:javax.servlet.Filter

2、重写doFilter方法

招来的门卫你得告诉他工作内容呀

public class LoginFilter implements Filter { 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException { 
        //通过大爷的火眼金睛,要放行啦!
        chain.doFilter(request,response); 
    } 
}

3、在web.xml中添加配置

招来门卫得在人力部门报道一下,不然谁给你工资呀,而且我们还得确认一下,这个门卫可以检查的人都有哪些,职别比较大的就不用门卫管了,随意进出

<-- 注册filter -->
<filter> 
    <filter-name>LoginFilter</filter-name> 
    <filter-class>com.lagou.LoginFilter</filter-class> 
</filter> 
<-- 设置filter范围 -->
<filter-mapping> 
    <-- 要与filter中的name对应 -->
    <filter-name>LoginFilter</filter-name> 
    <-- 设置范围,*代表访问所有路径都要经过filter -->
    <url-pattern>/*</url-pattern> 
</filter-mapping>

保安大队都能干啥呢,我们来看一下:

拉钩教育-Filter+Listener技术

init初始化操作肯定只有一次啦,刚入职的时候保安大队都会培训一下,其他的技能就要靠经验累积了

doFilter就是保安大队的主要工作职责,初始化一次,可以进行多次过滤

destory那就是退休了,不用你在这干了

FilterConfig又是啥呢?仔细看,在filter中的init方法,传入的参数就是FilterConfig类型的

那它能干嘛呢?顾名思义,就是Filter的一些配置信息嘛,那它就肯定能获取到与filter配置相关的一些内容,我们的filter在哪里配置的呢?当然是web.xml里啦,因此它获取到的值也就是我们在xml中所配置的值:

拉钩教育-Filter+Listener技术

这个getInitParameter是什么呀,这个可没看见过

别着急,它也是我们xml中的一段配置,用来配置一些默认的参数信息

<filter>
        <filter-name>LifeFilter</filter-name>
        <filter-class>com.lagou.demo02.LifeFilter</filter-class>
        <init-param>
            <param-name>userName</param-name>
            <param-value>admin</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
</filter>

这样就能明白了,getInitParameter就是获取xml中init-param的内容(是不是感觉这个类和properties类相似……)

什么?还能有多个过滤器?

不知道你们有没有在北京两会期间坐过地铁,有时候要接受好几个检查…… 也就是我们所说的多个过滤器

咋使用呀?很简单,重复单个过滤器的使用方式即可,如想对以html为结尾的访问加以过滤,可以这样写:

<filter>
        <filter-name>BFilter</filter-name>
        <filter-class>com.lagou.demo02.BFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>BFilter</filter-name>
        <url-pattern>*.html</url-pattern>
</filter-mapping>

<filter>
        <filter-name>AFilter</filter-name>
        <filter-class>com.lagou.demo02.AFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>AFilter</filter-name>
        <url-pattern>*.html</url-pattern>
</filter-mapping>

这两个filter总不能一起拦截吧?根据先来后到的方式,先配置了filter-mapping的过滤器先执行,那么在我们的例子中,就会先执行BFilter,再执行AFilter

过滤器有啥优点呢?

1、它可以实现代码的“可插拔性”,即增加或减少过滤器,都不会影响程序的使用

2、过滤器还可以复用,减少代码量,方便维护

过滤器的使用很简单,只要继承Filter类重写方法即可,最后在xml中配置一下就大功告成了,有了它感觉我的程序更安全了呢!

二、Listener监听器

不知道大家有没有看过《窃听风暴》这部电影,一部被名字耽误了的好片,墙裂推荐!

扯远了,listener监听器,监听谁呢?其实它是用来监听Servlet容器中产生的一些事件,那具体都有哪些事件呢?我们来看一下:

1、生命周期相关事件

servlet什么时候创建呀什么时候销毁啦,listener都得拿小本本记录下来

2、属性状态相关事件

当我们在servlet中setAttribute、getAttribute或者removeAttribute,都会被listener知道,吓人不!

3、存值状态相关事件

我们自己创建了一个对象,存储到了session中,那还能逃得了listener的法眼?记!

不管我们监听哪种事件,底层采用的都是接口回调的方式实现的

也就是说,监听器要依靠你传的接口子类来调用监听动作

监听器怎么使用呢?同filter一样,也是需要实现对应的接口,重写方法,在web.xml中配置就可以了,不过它比较简单,配置一下监听类的所在位置即可:

<listener>
    <listener-class>com.lagou.demo03.MyRequestListener</listener-class>
</listener>

2.2.1 ServletRequestListener监听器

 看名字就知道,是监听ServletRequest对象的,具体监听啥呢,就是监听request的创建和销毁,在方法里你可以写request在创建或销毁时想要做的操作:

拉钩教育-Filter+Listener技术

2.2.2 ServletRequestAttributeListener监听器

当你向request中setAttribute、removeAttribute时,ServletRequestAttributeListener就会知道

拉钩教育-Filter+Listener技术

ServletRequestAttributeEvent 这个参数对象,会获取到属性的名称、值等信息,也就是说,监听器不光知道你在增加,还知道你增加了啥!!

2.2.3 HttpSessionListener监听器

当浏览器发起请求时就会创建一个session,当浏览器关闭时,session也不会消失哦,session默认失效时间可有半个小时呢,要想修改session的有效时间,需要在web.xml中配置:

<session-config>
    <-- 有效时间3分钟 -->
    <session-timeout>3</session-timeout>
</session-config>

HttpSessionListener主要就来监听session的创建和销毁:

拉钩教育-Filter+Listener技术

2.2.4 HttpSessionListener监听器

当我们在session对象中setAttribute、removeAttribute时,该监听器都会监听到,同ServletRequestListener一样

拉钩教育-Filter+Listener技术

2.2.5 ServletContextListener监听器

当我们在启动项目时,会为每一个项目分配一个ServletContext对象,因此,启动项目即开启ServletContext,停掉项目,就是销毁ServletContext对象

拉钩教育-Filter+Listener技术

2.2.6 ServletContextAttributeListener监听器

不用多说,和其他监听属性的监听器类似,在application中添加修改删除属性时会被监听:

拉钩教育-Filter+Listener技术

2.2.7 HttpSessionBindingListener监听器

当我们写了一个类,实现了HttpSessionBindingListener接口时,该类在添加至session或从session中移除时,监听器都会监听到,这个监听器无需在xml中进行配置:

拉钩教育-Filter+Listener技术

2.2.8 HttpSessionActivationListener监听器

该监听器监听session数值的钝化和活化操作。

什么是钝化活化?

钝化其实就是序列化操作写入至硬盘,也就是我们所熟知的持久化操作,活化就是从硬盘加载至内存中,即非持久化

首先想要被监听的类必须实现SerializableHttpSessionActivationListener接口,当这个类存放至session后,此时停掉项目,就会执行钝化操作,在输出日志里我们可以看到保存文件的具体位置。当我们再启动项目后,访问session中的数据时,就会执行活化操作

用idea编程的小伙伴可能在活化过程中会出现问题,这是因为保存的文件被删掉了,解决这一问题就需要在tomcat安装目录下、conf文件夹中的context.xml末尾添加这么一段代码:

<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true">                                       
    <!-- 配置文件存放的路径信息,可以自由指定 -->
    <Store className="org.apache.catalina.session.FileStore" directory="C:\session"/> 
</Manager>

常用方法如下:

拉钩教育-Filter+Listener技术

三、总结

filter和listener的使用都还比较简单,虽然servlet不太常用了,但理解这里对今后框架的学习都会很有用处,不要小瞧任何一门知识哦!

拉钩教育-Filter+Listener技术相关教程

  1. 爬取人民教育出版社的课件并将课件保存在sqlite,层次保存电脑
  2. 在线教育软件开发与传统教学的区别
  3. 拉钩教育-EL和JSTL核心技术
  4. 【Django在线教育平台】03.xadmin后台系统配置,将models注册到x
  5. 在线教育项目(3)微信支付模块
  6. 【Django在线教育平台】02.创建该项目用到的数据库模型类
  7. 【Django在线教育平台】07.授课机构列表显示,分页、分类筛选、
  8. 【Django在线教育平台】06.找回密码,实现忘记密码及重置密码功