JAVA三大神器对比分析=及使用方法总结(Filter/Listener/Interceptor)
首先来对比一下使用,分析一下
属性对比 | Filter | Interceptor | Listener |
本质 | 是Servlet规范中的一个高级特性 , 不处理客户端请求, 只是用于对Request/Respose进行修改 | 是处在Spring容器,不依赖servlet容器,被spring管理 | |
实现方式 | 基于回调函数 | 基于java的反射(动态代理) | 监听事件触发 |
触发时机 | request请求之后<>servlet之前 | ||
作用范围 | 拦截几乎所有的请求(包含静态资源) | 只能拦截action请求(不能拦截静态资源的请求) | |
是否能访问action上下文及值栈的对象 | 不能 | 可以 | |
是否能获取spring容器中的对象 | 不能 | 可以 | |
调用的次数 | 在容器初始化时被调用一次 | 在action的生命周期内可以多次调用 | |
应用场景 |
过滤铭感词汇 设置字符编码 URL级别的权限访问控制 压缩响应信息等
|
登录验证:用户是否登录之类 权限验证:是否有访问权限 日志记录:统计访问量等 处理cookie,本地化, 国际化,主题 性能监控: 处理时长等 通用行为:涉及到多个处理器 |
测试, 过滤器的执行顺序
1.过滤器是JAVAEE标准, 采用函数回调的方式进行, 是在进入容器之后, 还未进入servlet之前进行的预处理, 并且在请求结束返回给前端这之间进行后期处理
chain.doFilter(request,response), 调用servlet的doService()方法是在chain.doFilter方法中进行的
2.拦截器其实是被包裹在过滤器之中的
Spring的拦截器与Servlet的过滤器有相似之处, 比如二者都是AOP编程思想的体现, 都能实现权限检查, 日志记录等, 不同的是
使用范围: 过滤器是Servlet规范规定的, 只能用于Web程序中, 而拦截器既可以用于Web程序, 也可以用于Application,Swing程序中
规范不通: 过滤器是在Servlet规范中定义的, 是Servlet容器支持的, 而拦截器是Spring容器内, 是Spring框架支持的
深度不同: Filte只在Serlvet前后起作用, 而拦截器能够深入到方法前后, 异常抛出前后灯, 因此拦截器的使用具有更大的弹性, Spring构架中要优先使用拦截器