监听器Listener
监听器用于监听Web应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计网站在线人数、系统加载时进行信息初始化、统计网站的访问量等等。
| HttpSessionListener | 监听session状态 | 计算登录人数、、 |
| ServletContextLister | 监听应用启动 | 数据库拦截池初始化 |
过滤器Filter
- 通过实现Filter接口实现或者@WebFilter注解实现
- 一共三个方法需要实现
-
- init():容器初始化时调用,只调用一次
- doFilter():每次请求调用,需要调用fiterChain.doFiter()掉下一个过滤器
- destroy():容器销毁时调用,只调用一次
- 主要用在一些权限拦截,中文乱码处理
拦截器interceptor(不属于javaweb,而是spring的)
- 通过实现HandlerInterceptor接口实现
- 一共三个方法需要实现
-
- preHandler():在请求处理前执行,返回fasle时视为请求结束,所有的拦截器都不执行了
- postHandler():调用controller方法后执行的
- afterCompletion:执行完preHandler方法并返回true时并且响应给视图后执行的
- 主要用户非法限制
过滤器与拦截器的不同
| 过滤器 | 拦截器 | |
| 底层原理 | 底层基于函数调用 | 底层基于java反射 |
| 使用范围 | 在servlet包下定义的,所以使用需要依赖容器(tomcat等) | 是spring的一个组件不依赖容器 |
| 触发范围 | 在servlet之前就能触发 | 在setvlet之后才能触发 |
| 拦截处理范围 | 几乎所有进入容器的请求都能过滤到 | 只会处理controller和static下的请求 |
| 注入bean的情况 | 能正常注入bean | 由于拦截器加载在springcontext之前(springcontext加载才会创建bean对象),所以不能正常注入 |
| 控制执行顺序方式 | 通过@Oder()注解控制,越小越先执行 | 通过注册时的顺序执行;但是由于底层源码原因,preHandle()会按顺序执行,postHandle()会反过来执行 |