过滤器和监听器

120 阅读2分钟

1 过滤器概述

日志的作用

  • 日志的记录
  • 性能的分析
  • 乱码的处理
  • 事务的控制
  • 登录的控制
  • 跨域的处理

过滤器的使用

  • 用户请求到达目标资源之前,记录用户的请求资源路径
  • 响应之前记录本次请求目标资源运算的耗时
  • 可以选择将日志记录进入文件,为了方便测试,这里将日志直接在控制台打印

过滤器链

一个web项目中,可以同时定义多个过滤器,多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链

  • 过滤器链中的过滤器的顺序由filter-mapping顺序决定
  • 每个过滤器过滤的范围不同,针对同一个资源来说,过滤器链中的过滤器个数可能是不同的
  • 如果某个Filter是使用ServletName进行匹配规则的配置,那么这个Filter执行的优先级要更低

图解过滤器链

注解方式

String displayName() default "";

WebInitParam[] initParams() default {};

String filterName() default "";

String smallIcon() default "";

String largeIcon() default "";

String[] servletNames() default {};

String[] value() default {};

String[] urlPatterns() default {};

DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};

boolean asyncSupported() default false;

}

监听器概述

监听器:专门用于对域对象对象身上发生的事件或状态改变进行监听和相应处理的对象

  • 监听器是GOF设计模式中,观察者模式的典型案例
  • 观察者模式: 当被观察的对象发生某些改变时, 观察者自动采取对应的行动的一种设计模式
  • 监听器使用的感受类似JS中的事件,被观察的对象发生某些情况时,自动触发代码的执行
  • 监听器并不监听web项目中的所有组件,仅仅是对三大域对象做相关的事件监听

定义监听器

1 application域监听器

ServletContextListener 监听ServletContext对象的创建与销毁

2 session域监听器

HttpSessionListener 监听HttpSession对象的创建与销毁

3 request域监听器

ServletRequestListener 监听ServletRequest对象的创建与销毁

3 session绑定监听器

HttpSessionBindingListener 监听当前监听器对象在Session域中的增加与移除

// 监听销毁
@Override
public void requestDestroyed(ServletRequestEvent sre) {
    ServletRequest request = sre.getServletRequest();
    System.out.println("request"+request.hashCode()+" destoryed");
}


// 监听数据增加
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
    String name = srae.getName();
    Object value = srae.getValue();
    ServletRequest request = srae.getServletRequest();
    System.out.println("request"+request.hashCode()+" add:"+name+"="+value);
}

//  监听数据移除
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
    String name = srae.getName();
    Object value = srae.getValue();
    ServletRequest request = srae.getServletRequest();
    System.out.println("request"+request.hashCode()+" remove:"+name+"="+value);
}
// 监听数据修改
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
    String name = srae.getName();
    Object value = srae.getValue();
    ServletRequest request = srae.getServletRequest();
    Object newValue = request.getAttribute(name);
    System.out.println("request"+request.hashCode()+" change:"+name+"="+value+" to "+newValue);
}

}