拦截/监听器 —— Filter、Interceptor、Listener

Servlet过滤器(HttpFilter)

Spring拦截器(HttpInterceptor) —— 特定class 或者方法的 filter

Spring AOP —— spring版本的filter


Struts2拦截器(AbstructInterceptor)       —— struts版本的filter


Spring 监听器(Listener)


    1、Filter的功能
    filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).

    一个Filter包括:

    1)在servlet被调用之前截获;

    2)在servlet被调用之前检查servlet request;

    3)根据需要修改request头和request数据;

    4)根据需要修改response头和response数据;

    5)在servlet被调用之后截获.

    服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结。

    每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及 response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个 filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下 一个filter

    例子:

    首先新建一个Filter

[java] view plaincopy
  1. public class LogFilter implements Filter {  
  2.     private FilterConfig filterConfig;  
  3.   
  4.     public FilterConfig getFilterConfig() {  
  5.         System.err.println("...getFilterConfig...");  
  6.         return filterConfig;  
  7.     }  
  8.   
  9.     public void setFilterConfig(FilterConfig filterConfig) {  
  10.         System.err.println("...setFilterConfig...");  
  11.         this.filterConfig = filterConfig;  
  12.     }  
  13.   
  14.     @Override  
  15.     public void destroy() {  
  16.         System.err.println("...filter destroy...");  
  17.     }  
  18.   
  19.     @Override  
  20.     public void doFilter(ServletRequest request, ServletResponse response,  
  21.             FilterChain chain) throws IOException, ServletException {  
  22.         System.err.println("...doFilter...");  
  23.         chain.doFilter(request, response);//看到这没,这只要是传递下一个Filter  
  24.     }  
  25.   
  26.     @Override  
  27.     public void init(FilterConfig filterConfig) throws ServletException {  
  28.         System.err.println("...init Filter...");  
  29.         this.filterConfig = filterConfig;  
  30.     }  
  31.   
  32. }  

在web.xml里配置

[html] view plaincopy
  1. <filter>  
  2.     <filter-name>LogFilter</filter-name>  
  3.     <filter-class>com.ee.filter.LogFilter</filter-class>  
  4. </filter>  
  5.   
  6. <filter-mapping>  
  7.     <filter-name>LogFilter</filter-name>  
  8.     <url-pattern>/*</url-pattern>  
  9. </filter-mapping>  

    启动运行

    可以看到...init Filter...首先在TOMCAT启动时即被打印,然后在运行里面再看到...doFilter...被打印。


    2、Listener功能

    它是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:

    4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener ;

    2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener。

 

    Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。

    常用的监听接口有以下几个:

    ServletContextAttributeListener监听对ServletContext属性(增/删/改)的操作。

    ServletContextListener监听ServletContext的操作:

        当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;

        当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。

    HttpSessionListener监听HttpSession的操作:

        当创建一个Session时,激发session Created(HttpSessionEvent se)方法(这样就可以给在线人数+1);

        当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

    HttpSessionAttributeListener监听HttpSession中的属性的操作。

        当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;

        当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;

        当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。


    下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在ServletContext初始化和销毁时,在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时,在服务器控制台打印对应的信息。

    要获得以上的功能,监听器必须实现以下3个接口:

    HttpSessionListener

    ServletContextListener

    ServletContextAttributeListener

    例子:

[java] view plaincopy
  1. public class OnlineUserListener implements HttpSessionListener,  
  2.         ServletContextListener, ServletContextAttributeListener {  
  3.     private long onlineUserCount = 0;  
  4.   
  5.     public long getOnlineUserCount() {  
  6.         return onlineUserCount;  
  7.     }  

  8.     @Override  
  9.     public void attributeAdded(ServletContextAttributeEvent arg0) {  
  10.   
  11.     }  

  12.     @Override  
  13.     public void attributeRemoved(ServletContextAttributeEvent arg0) {  
  14.   
  15.     }  

  16.     @Override  
  17.     public void attributeReplaced(ServletContextAttributeEvent attributeEvent) {  
  18.         System.err.println("...attributeReplaced...");  
  19.     }  

  20.     @Override  
  21.     public void contextDestroyed(ServletContextEvent arg0) {  
  22.   
  23.     }  

  24.     @Override  
  25.     public void contextInitialized(ServletContextEvent arg0) {  
  26.   
  27.     }  

  28.     @Override  
  29.     public void sessionCreated(HttpSessionEvent httpSessionEvent) {  
  30.         onlineUserCount ++;  
  31.         toUpdateCount(httpSessionEvent);  
  32.     }  

  33.     @Override  
  34.     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {  
  35.         onlineUserCount --;  
  36.         toUpdateCount(httpSessionEvent);  
  37.     }  
  38.   
  39.     private void toUpdateCount(HttpSessionEvent httpSessionEvent){  
  40.         httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);  
  41.     }  
  42. }  

Web.xml

[html] view plaincopy
  1. <listener>  
  2.     <listener-class>com.ee.listener.OnlineUserListener</listener-class>  
  3. </listener>  

JSP页面:

[html] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>主页</title>  
  8. </head>  
  9. <body>  
  10.     <h4>你好!</h4>  
  11.     在线人数:<h1><%=request.getSession().getAttribute("onlineUserCount") %></h1>  
  12. </body>  
  13. </html> 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值