大家好,我是IT修真院郑州分院第12期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务二,深度思考中的知识点——什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?
1.背景介绍
- Filter是什么
过滤器:依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,一个过滤器实例只能在容器初始化时调用一次 - Interceptor是什么
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,
就是在一个方法前,调用一个方法,或者在方法后,调用一个方法 - AOP是什么
AOP(Aspect-Oriented Programming)是一种编程思想,对OOP的补充
常见实现:Filter和拦截器(代理模式)
OOP: 对于所有对象中都存在的一些公共行为,无能为力
为减少重复代码,AOP(面向切面)技术诞生
2.知识剖析
2.1 Filter 的使用:
(1)在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest
(2)根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据
(3)根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据
2.2 创建一个Filter
(1)创建Filter 处理类
init方法、destory方法、doFilter方法
(2)在web.xml 文件中配置Filter
2.3 interceptor 使用
通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类,
复写preHandle()、postHandle()和afterCompletion()来对用户的请求进行拦截处理
3.常见问题
3.1 Filter与interceptor的区别
(1) 接口定义不同
Filter 接口定义在 javax.servlet 包中,接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中
(2) 规范不同
Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的;拦截器是在 Spring容器内的,是Spring框架支持的
(3) 使用资源不同
拦截器是一个Spring的组件,归Spring管理,因此能使用Spring里的任何资源、对象;Filter 不能够使用 Spring 容器资源
(4) 深度不同
Filter在只在 Servlet 前后起作用;拦截器能够深入到方法前后、异常抛出前后等。
(5) 调用者不同
Filter 是被 Server 调用;Interceptor 是被 Spring 调用。
因此 Filter 总是优先于 Interceptor 执行
3.2 多个过滤器执行顺序
(1): 执行 第一个Filter中chain.doFilter()之前的部分
(2): 执行 第二个Filter中chain.doFilter()之前的部分
(3): 业务逻辑
(4): 执行 第二个Filter中chain.doFilter()之后的部分
(5): 执行 第一个Filter中chain.doFilter()之后的部分
3.3 面向切面编程
(1)通知(增强)Advice:你想要的功能
(2)连接点 Join point:spring允许你是通知(Advice)的地方
spring 方法 ,AspectJ支持构造器或属性注入时
(3)切点 Pointcut:连接点的基础上,来定义切入点
(4)切面 Aspect:通知和切入点的结合
(5)引入 Introduction: 向现有的类添加新方法属性
(6)织入 Weaving : 切面应用到目标对象来创建新的代理对象的过程
4.编码实战
5.扩展思考
5.1 多个过滤器与拦截器的代码执行顺序
过滤器在servlet启动后开始执行,进入页面访问开始执行拦截器
5.2 AOP实现,统一异常
重点在切点的定义,异常可以为预期异常和非预期异常,处理方式不同
5.2 监听器
以监听Web应用的上下文信息、Servlet请求信息和Servlet会话信息,即ServletContext、ServletRequest、HttpSession
执行顺序:监听器>过滤器>拦截器
6.参考文献
- Filter及FilterChain的使用
(1)https://blog.csdn.net/zhaozheng7758/article/details/6105749 - 监听器
(2)https://www.cnblogs.com/dudududu/p/8507735.html - filter、interceptor、aop实现
(3)https://blog.csdn.net/FU250/article/details/80292293
7.更多讨论
(1)Listener的分类有哪些?
- 按照对象 Servlet的Listener监听器包括三种类型:
- ServletContextListener 监听ServletContext对象
- HttpSessionListener 监听Session对象
- HttpRequestListener 监听Request对象
- 按照监听事件类型划分:
- 用于监听域对象自身的创建和销毁的事件监听器。
- 用于监听域对象的属性的增加和删除的事件监听器。
- 用于监听绑定到HttpSession域中的某个对象的状态的事件监听器。
(2)监听器是全局监听还是局部监听?能不能实现局部和短时间的监听?
- ServletContext :上下文;
应用服务器一启动就产生该对象,服务器关闭即销毁
作用于全局,所有Servlet ,相当于静态变量 - HttpSession 会话
客户端第一次请求产生,session过期销毁
作用于同一个客户端,相当于成员变量
短时间的监听的可以使用定时任务或或者手动设置session的时间。
(3)过滤器的执行过程,调用接口的顺序
如果有多个过滤器,那么过滤器的初始化顺序是web.xml中配置由下到上的(注意:容器启动的时候的初始化顺序是由下到上,但是在用户进行资源的访问的时候,
过滤器复写的public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)方法是由上至下的,也就是还是按照web.xml中配置的顺序由上到下执行,只是初始化的时候的顺序是相反的)
(4) 监听器其主要作用是什么?
- 计在线人数,利用HttpSessionLisener
- 加载初始化信息:利用ServletContextListener
- 统计网站访问量实现访问监控
感谢观看,如有出错,恳请指正
转载自原文链接, 如需删除请联系管理员。
原文链接:什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?,转载请注明来源!