Java Web学习十八:Filter与Listener
一:Filter过滤器
Filter顾名思义,web中的过滤器,是在服务器中的资源被访问时,Filter会将请求拦截下来,完成特殊的功能。一般用于完成通用的操作,如:登录验证,统一编码处理,敏感字符的过滤…
1.如何配置过滤器?
(1)IDEA支持用注解来配置拦截路径,例如 @WebFilter("/*") //访问所有资源之前,都会执行该过滤器
(2)web.xml配置:Filter与Servlet一样,web中用web,xml中同样的可以配置,格式与Servlet也是一般
<filter>
<filter-name>demo1</filter-name>
<!-- Filter所在位置-->
<filter-class>cn.itcast.web.filter.FilterDome1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
2.Filter执行的流程(doFilter中的执行过程)
(1)执行过滤器
(2)执行放行后的资源 filterChain.doFilter(servletRequest,servletResponse);放行是指允许访问该资源
(3)回来执行放行代码下边的代码
代码如下:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//对request对象请求消息进行增强
System.out.println("FilterDome执行...");
//放行
filterChain.doFilter(servletRequest,servletResponse);
//对response对象的响应消息进行增强
System.out.println("FilterDome再次的执行");
}
注意:连续访问资源时,每次都会执行Filter中的doFilter方法
3.Filter的生命周期
Filter中默认有init doFilter destroy 三个需要复写的方法,故它的生命周期
1.init
是在服务器启动后,会创建一个Filter对象,然后调用init方法,init方法只执行一次 用于加载资源
2.doFilter
每一次请求(访问资源时)被拦截时,会执行,并且doFilter方法会被执行多次(拦截几次执行几次)
3.destroy
在服务器关闭后,Filter对象也被销毁掉 ,服务器正常关闭的话会执行destory方法,只执行一次,来释放资源
4.Filter拦截配置详解
*拦截路径配置:
(1)具体的资源路径:/index.jsp 只有访问index.jsp资源的时候,Filter才会被执行
(2)拦截目录(某一目录下所以的资源):/user/ 只有访问/user下的资源时,Filter都会被执行*
(3)后缀名的拦截:*.jsp 访问所有后缀名为jsp的资源时,Filter都会被执行
(4)拦截所有的资源:/* 访问所有的资源时,Filter都会被执行
*拦截方式的配置:资源被访问的方式
*IDEA的注解配置:
*设置dispatcherTypes的属性
(1)REQUEST:为dispatchTypes的默认值,浏览器直接请求资源。
(2)FORWARD:转发来访问资源
(3)INCLUDE:包含访问资源
(4)ERROR:错误跳转资源
(5)ASYNC:异步访问资源
例如 @WebFilter(value = “/index.jsp”,dispatcherTypes = DispatcherType.REQUEST ),浏览器直接请求index.jsp资源时,访问所以资源都会执行该过滤器
还可以叠加 @WebFilter(value = “/index.jsp”, {DispatcherType.REQUEST,DispatcherType.FORWARD} )浏览器直接请求或者转发访问index.jsp资源时,访问所以资源都会执行该过滤器
*web.xml配置:
* 设置<dispatcher></dispatcher>标签即可
5.过滤器链(配置了多个过滤器)
(1)执行顺序:如果有两个过滤器:过滤器1和过滤器2
-
过滤器1
-
过滤器2
-
资源执行
-
过滤器2
-
过滤器1
注:类似于递归调用
2) 过滤器先后顺序问题:
1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
- 如: AFilter 和 BFilter,AFilter就先执行了。
- web.xml配置: 谁定义在上边,谁先执行。
二:Filter使用案例
1.登录验证
- 需求:
-
访问day17_case案例的资源。验证其是否登录
-
如果登录了,则直接放行。
-
如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
-
- 案例2_敏感词汇过滤
- 需求:
-
对day17_case案例录入的数据进行敏感词汇过滤
-
敏感词汇参考《敏感词汇.txt》(一个自建的敏感词汇的文档)
-
如果是敏感词汇,替换为 ***
- 分析:
-
对request对象进行增强。增强获取参数相关方法
-
放行。传递代理对象
-
增强对象的功能:
-
设计模式:一些通用的解决固定问题的方式
例:联想代理商卖电脑
-
装饰模式
-
代理模式
- 概念:
- 真实对象:被代理的对象
2. 代理对象:
3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
- 实现方式:
-
静态代理:有一个类文件描述代理模式
-
动态代理:在内存中形成代理类
- 实现步骤:
- 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance();
3. 使用代理对象调用方法。
- 增强方法
- 增强方式:
-
增强参数列表
-
增强返回值类型
-
增强方法体执行逻辑
实现案例:敏感词汇
增强getParameter方法,使得是敏感词汇时,会显示***
三:Listener监听器
1.概念:web的三大组件(servlet,filter,listener)之一
(1)事件监听机制
事件:一件事情
事件源:事件发生(进行)的地方
监听器:一个创建的对象
注册监听:将事件,事件源,监听器绑定在一起,当事件源发生某个事件后,执行监听器代码
(2)ServletCpntextListener:监听ServletContext对象的创建和销毁
方法:
void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
步骤:
1.定义一个类,实现ServletContextListener接口,并复写起方法
2,配置
(1)web.xml
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
指定初始化参数
(2)IDEA注解