一、Filter过滤器
1.1 基本概念
Filter就是我们的过滤器,它存在于浏览器和服务器之间,以前我们浏览器发送请求时,会直接发送至服务器,而现在不同了,浏览器发送请求要发送给filter,filter来判断你是不是有资格请求我的资源,有点看门大爷的意思了,大爷认证通过你的身份后呢,就会给你指路,告诉你要访问的资源在哪,等你获取了响应后往大门走,还会路过大爷,大爷也会检查检查你,看看有没有带什么不该带的出去,检查通过了,响应才会传至浏览器,如下图所示:
1.2 使用方式
想要拥有我们的同款大爷,需要以下操作:
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>
1.3 Filter接口
保安大队都能干啥呢,我们来看一下:
init初始化操作肯定只有一次啦,刚入职的时候保安大队都会培训一下,其他的技能就要靠经验累积了
doFilter就是保安大队的主要工作职责,初始化一次,可以进行多次过滤
destory那就是退休了,不用你在这干了
1.4 FilterConfig接口
FilterConfig又是啥呢?仔细看,在filter中的init方法,传入的参数就是FilterConfig类型的
那它能干嘛呢?顾名思义,就是Filter的一些配置信息嘛,那它就肯定能获取到与filter配置相关的一些内容,我们的filter在哪里配置的呢?当然是web.xml里啦,因此它获取到的值也就是我们在xml中所配置的值:
这个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类相似……)
1.5 多个过滤器使用
什么?还能有多个过滤器?
不知道你们有没有在北京两会期间坐过地铁,有时候要接受好几个检查…… 也就是我们所说的多个过滤器
咋使用呀?很简单,重复单个过滤器的使用方式即可,如想对以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.6 filter总结
过滤器有啥优点呢?
1、它可以实现代码的“可插拔性”,即增加或减少过滤器,都不会影响程序的使用
2、过滤器还可以复用,减少代码量,方便维护
过滤器的使用很简单,只要继承Filter类重写方法即可,最后在xml中配置一下就大功告成了,有了它感觉我的程序更安全了呢!
二、Listener监听器
2.1 基本概念
不知道大家有没有看过《窃听风暴》这部电影,一部被名字耽误了的好片,墙裂推荐!
扯远了,listener监听器,监听谁呢?其实它是用来监听Servlet容器中产生的一些事件,那具体都有哪些事件呢?我们来看一下:
1、生命周期相关事件
servlet什么时候创建呀什么时候销毁啦,listener都得拿小本本记录下来
2、属性状态相关事件
当我们在servlet中setAttribute、getAttribute或者removeAttribute,都会被listener知道,吓人不!
3、存值状态相关事件
我们自己创建了一个对象,存储到了session中,那还能逃得了listener的法眼?记!
不管我们监听哪种事件,底层采用的都是接口回调的方式实现的
也就是说,监听器要依靠你传的接口子类来调用监听动作
2.2 监听器详解
监听器怎么使用呢?同filter一样,也是需要实现对应的接口,重写方法,在web.xml中配置就可以了,不过它比较简单,配置一下监听类的所在位置即可:
<listener>
<listener-class>com.lagou.demo03.MyRequestListener</listener-class>
</listener>
2.2.1 ServletRequestListener监听器
看名字就知道,是监听ServletRequest对象的,具体监听啥呢,就是监听request的创建和销毁,在方法里你可以写request在创建或销毁时想要做的操作:
2.2.2 ServletRequestAttributeListener监听器
当你向request中setAttribute、removeAttribute时,ServletRequestAttributeListener就会知道
2.2.3 HttpSessionListener监听器
当浏览器发起请求时就会创建一个session,当浏览器关闭时,session也不会消失哦,session默认失效时间可有半个小时呢,要想修改session的有效时间,需要在web.xml中配置:
<session-config>
<-- 有效时间3分钟 -->
<session-timeout>3</session-timeout>
</session-config>
HttpSessionListener主要就来监听session的创建和销毁:
2.2.4 HttpSessionAttributeListener监听器
当我们在session对象中setAttribute、removeAttribute时,该监听器都会监听到,同ServletRequestListener一样
2.2.5 ServletContextListener监听器
当我们在启动项目时,会为每一个项目分配一个ServletContext对象,因此,启动项目即开启ServletContext,停掉项目,就是销毁ServletContext对象
2.2.6 ServletContextAttributeListener监听器
不用多说,和其他监听属性的监听器类似,在application中添加修改删除属性时会被监听:
2.2.7 HttpSessionBindingListener监听器
当我们写了一个类,实现了HttpSessionBindingListener接口时,该类在添加至session或从session中移除时,监听器都会监听到,这个监听器无需在xml中进行配置:
2.2.8 HttpSessionActivationListener监听器
该监听器监听session数值的钝化和活化操作。
什么是钝化活化?
钝化其实就是序列化操作写入至硬盘,也就是我们所熟知的持久化操作,活化就是从硬盘加载至内存中,即非持久化
首先想要被监听的类必须实现Serializable、HttpSessionActivationListener接口,当这个类存放至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的使用都还比较简单,虽然servlet不太常用了,但理解这里对今后框架的学习都会很有用处,不要小瞧任何一门知识哦!