过滤器与监听器

过滤器

概念

在现实生活中,自来水都是经过一层层的过滤处理才达到食用标准的,每一层过滤都起到一种净水化的作用。Java Web 中的 Servlet 过滤器与自来水被
过滤的原理相似。Servlet 过滤器主要用于对客户端的请求进行过滤处理,现将过滤后的请求转交给下一资源,它在 Java Web 开发中具有十分重要的作用。
Servlet 过滤器与 Servlet 十分相似,但它具有拦截客户端(浏览器)请求的功能,Servlet 过滤器可以改变请求中的内容,来满足实际开发中的需要。对于
程序开发人员而言,过滤器实质就是在Web 应用服务器上的一个Web 应用组件,用于拦截客户端(浏览器)与目标资源的请求,并对这些请求进行一定过滤
处理再发送给目标资源,过滤器的处理方式如下图所示。

过滤器的核心对象

 

过滤器对象放置在 javax.servlet 包中,其名称为 Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有 FilterConfig 对象与 FilterChain 对象,这
个两个对象也同样是接口对象,位于 javax.servlet 包中,分别为过滤器的配置对象与过滤器的传递工具。

(1)Filter 接口: 每个过滤器对象都要直接或间接地实现 Filter 接口,在 Filter 接口中定义了 3 个方法,分别为 init()方法、doFilter()方法和 destroy()方法。
(2)FilterConfig 接口:FilterConfig 接口由 Servlet 容器进行实现,主要用于获取过滤器中的配置信息,定义方法有 getFilterName(),getServletContext(),
getInitParameter
(String name),getInitParameterNames()
(3)FilterChain 接口:它也是由 Servlet 容器进行实现,在这个接口中只有一个方法,其方法声明如下:public void doFilter(......);
该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么,请求将传达给目标资源。

实战 -- 判断访客个数

index.jsp

web.xml   配置过滤器

通过注解配置

Filter类,这里是MyFilter

 1 package com.jinxin.www.Filter;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.annotation.WebFilter;
 5 import javax.servlet.annotation.WebInitParam;
 6 import java.io.IOException;
 7 
 8 /**
 9  * Author: Mr King
10  * Date: 2018-05-10 10:38
11  */
12 @WebFilter(urlPatterns="/*", initParams={
13     @WebInitParam(name="count", value="6000"),
14 }, dispatcherTypes={
15         DispatcherType.REQUEST, DispatcherType.FORWARD
16 })
17 public class MyFilter implements Filter {
18     // 计数值
19     private int count = 0;
20 
21 
22     @Override
23     public void init(FilterConfig filterConfig) throws ServletException {
24         System.out.println("过滤器启动");
25         // 拿到初始化数值
26         count = Integer.parseInt(filterConfig.getInitParameter("count"));
27     }
28 
29     @Override
30     public void doFilter(ServletRequest req, ServletResponse rep, FilterChain chain) throws IOException, ServletException {
31         //每检测一位用户登录,执行一次count++
32         count++;
33         //将数据刷新到context里面
34         req.getServletContext().setAttribute("count", count);
35         // 将数据传递下去
36         chain.doFilter(req, rep);
37     }
38 
39     @Override
40     public void destroy() {
41         System.out.println("过滤器销毁");
42     }
43 }
View Code

 

过滤器解决编码问题 

Java Web 程序开发中,由于Web 容器内部所使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据,就会出现乱码现象,如下图所示。

 

如果在每个Servlet里面单独配置编码也是可以的,但是这样会增加代码量,每生成一个Servlet就得配置一下,这时就可以通过Filter一次性配置

监听器 

在Servlet 技术中已经定义了一些事件,并且可以针对这些事件来编写相关的时间监听器,从而对事件作出相应处理。例如,想要在Web 应用程序启动和
关闭是来执行一些任务(如数据库的连接的建立和释放)。或者想要监控 Session 的创建和销毁,那么就可以通过监听器来实现。

Servlet监听器的原理

Servlet 监听器是当今 Web 应用开发的一个重要组成部分。它是在 Servlet2.3 规范中和 Servlet 过滤器一起引入的,并且在 Servlet 2.4 规范中对其进行了较
大的改进,主要就是用来对 Web 应用进行监听和控制的,极大地增强了 Web 应用的事件处理能力。
Servlet 监听器的功能比较接近 Java 的 GUI 程序的监听器,可以监听由于 Web 应用中状态改变而引起的 Servlet 容器产生的相应事件,然后接受并处理这
些事件。

Servlet监听器简介

监听器的作用是监听 Web 容器的有效期事件,因此它是由容器管理的。利用 Listener 接口监听在容器中的某个执行程序,并且根据其应用程序的需求做
出适当的响应。下表列出了 Servlet 和 JS 中的 8 个 Listener 接口和 6 个 Event 类。

Listener接口与Event类
Listener接口 Event类
ServletContextListener ServletContextEvent
ServletContextAttributeListener ServletContextAttributeEvent
HttpSessionListener HttpSessionEvent
HttpSessionActivationListener
HttpSessionAttributeListener HttpSessionBindingEvent
HttpSessionBindingListener
ServletRequestListener ServletRequestEvent
ServletRequestAttributeListener  ServletRequestAttributeEvent

 

 

 

 

 

 

 

 

 

 

 

 

Servlet上下文监听

Servlet 上下文监听可以监听 ServletContext 对象的创建、删除以及属性添加、删除和修改操作,该监听器需要用到如下两个接口。

ServletContextListener接口

该接口存放在 Javax.servlet 包内,他主要实现监听 ServletContext 的创建和删除。提供了两个方法,他们也被称为“Web 应用程序的声明周期方法”。

contextInitialized(ServletContextEvent event)  通知正在收听的对象,应用程序应经被加载及初始化。
contextDestroyed(ServletContextEvent event)  通知正在收听的对象,应用程序已经被载出,即关闭。

 

 

 

ServletContextAttributeListener接口

该接口存放在 Javax.servlet 保内,主要实现监听 ServletContext 属性的增加、删除和修改。ServietAttributeListener 接口提供一下 3 种方法。

attributeAdded(ServletContextAttributeEvent event)  当有对象加入Application的范围时,通知正在收听的对象 
attributeReplaced(ServletContextAttributeEvent event)  当在Applicatio的范围有对象取代另一个对象时,通知正在收听的对象。
attributeRemoved(ServletContextAttributeEvent event)  当有对象从Application的范围移除时,通知正在收听的对象 

 

 

 

 

 

创建监听器

public class MyContentListener implements ServletContextListener{
...//省略了监听器中间的相关代码
}
要让 Web 容器在 Web 应用程序启动时通知 MyServletContentListener,需要在 web.xml 文件中使用<listener>标签来配置监听器类。在 Web 中需要进行配置。
<listener>
    <listener-class>com.listener.MyServletContentListener</listener-class>

</listener>

http会话监听

HTTP 会话监听(HttpSession)信息,有 4 个接口可以进行监听。

HttpSessionListener接口实现监听HTTP会话创建、销毁

sessionCreated(HttpSessionEvent event)  通知正在接听的对象,session已经被加载及初始化 
sessionDestroyed(HttpSessionEvent event)

通知正在接听的对象,session已经被载出(HttpSessionEvent 类
的主要方法是
getSession(), 可以使用该方法回传一个session对象

 

 

 

 

 

HttpSessionActivationListener接口实现监听HTTP会话 acitive 和 passivate

attributeAdded (HttpSessionBindingEvent event) 当有对象加入session范围时,通知正在收听的对象 
attributeReplaced(HttpSessionBindingEvent event) 当在session的范围有对象取代另一个对象时,通知正接收的对象。
attributeRemoved(HttpSessionBindingEvent event) 当有对 象从session的范 围移 除时, 通知 正在 收听 的 对象(

HttpSessionBindingEvent 类主要 有 3 3 个方法: getName() 、
getSession ()和 getValues()

 

 

 

 

 

 

 

HttpSessionAttributeListener接口实现监听HTTP会话中属性的请求

sessionDidActivate(HttpSessionEvent event) 通知正在收听的对象,它的session已经变为有效状态
sessionWillPassivate(HttpSessionEvent event) 通知正在收听的对象,它的session已经变为无效状态

 

 

 

HttpSessionBindingListener接口实现监听HTTP会话中对象的绑定信息。它是唯一不需要再web.xml中设定Listener的,直接将该监听器存入session即可

valueBound(HttpSessionBindingEvent event) 当有对象加入session的范围时,会被自动调用
valueUnBound(HttpSessionBindingEvent event) 当有对象从session的范围移除时会被自动调用

 

 

 

Servlet请求监听

在Servlet 2.4 规范中,新增加了一个技术,就是可以监听客户端的请求。一旦能够在监听程序中获取客户端的请求,就可以对请求进行统一处理。要实现
客户端的请求和请求参数设置的监听需要实现两个接口。

ServletRequestListener接口提供两个方法

requestListene(ServletRequestEvent event) 通知正在收听的对象,ServletRequest  已经被加载及初始化。
requestDestroyed(ServletRequestEvent event) 通知正在收听的对象,ServletRequest 已经被载出,即关闭。

 

 

 

ServletRequestAttributeListener接口提供三个方法

attributeAdded(ServletRequestAttributeEvent event) 当有对象加入request的范围时,通知正在接受的对象
attributeReplaced(ServletRequestAttributeEvent event)

当在 request 的范围内有对象取代另一个对象时,通知正在接受的
对象。

attributeRemoved(ServletRequestAttributeEvent event)  当有对象从 request 的范围移除时,通知正在接受的对象。
posted @ 2018-05-10 19:40  Jin同学  阅读(191)  评论(0)    收藏  举报