SpringMVC - Filter、Interceptor、AOP 区别

简介: SpringMVC - Filter、Interceptor、AOP 区别

Filter 过滤器

过滤器拦截web访问url地址。 严格意义上讲,filter只是适用于web中,依赖于Servlet容器,利用Java的回调机制进行实现。

Filter过滤器:和框架无关,可以控制最初的http请求,但是更细一点的类和方法控制不了。

过滤器可以拦截到方法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出像响应的过滤操作,

比如设置字符编码,鉴权操作等

Interceptor 拦截器

拦截器拦截以 .action结尾的url,拦截Action的访问。 Interfactor是基于Java的反射机制(APO思想)进行实现,不依赖Servlet容器。

拦截器可以在方法执行之前(preHandle)和方法执行之后(afterCompletion)进行操作,回调操作(postHandle),可以获取执行的方法的名称,请求(HttpServletRequest)

Interceptor:可以控制请求的控制器和方法,但控制不了请求方法里的参数(只能获取参数的名称,不能获取到参数的值)

(用于处理页面提交的请求响应并进行处理,例如做国际化,做主题更换,过滤等)。

AOP 拦截器

常用在拦截Spring管理Bean的访问(更多与业务挂钩)(原文这里提到只能对 Service 层拦截,个人认为这不一定的,之前不懂就把AOP当Filter 与 Interceptor用都有,哈哈)。

实际开发中,AOP常和事务结合。

AOP操作可以对操作进行横向的拦截,最大的优势在于他可以获取执行方法的参数( ProceedingJoinPoint.getArgs() ),对方法进行统一的处理。

常见使用日志,事务,请求参数安全验证等。

Aspect : 可以自定义切入的点,有方法的参数,但是拿不到http请求,可以通过其他方式如RequestContextHolder获得

ServletRequestAttributes servletRequestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

Filter 与 Interceptor 联系与区别

拦截器是基于java的反射机制,使用代理模式,而过滤器是基于函数回调。

拦截器不依赖servlet容器,过滤器依赖于servlet容器。

拦截器只能对action起作用,而过滤器可以对几乎所有的请求起作用(可以保护资源)。

拦截器可以访问action上下文,堆栈里面的对象,而过滤器不可以。

执行顺序:过滤前-拦截前-Action处理-拦截后-过滤后。

从上面对拦截器与过滤器的描述来看,它俩是非常相似的,都能对客户端发来的请求进行处理,它们的区别如下:


作用域不同

过滤器依赖于servlet容器,只能在servlet容器,web环境下使用

拦截器依赖于spring容器,可以在spring容器中调用,不管此时Spring处于什么环境

细粒度的不同

过滤器的控制比较粗,只能在请求进来时进行处理,对请求和响应进行包装

拦截器提供更精细的控制,可以在controller对请求处理之前或之后被调用,也可以在渲染视图呈现给用户之后调用

中断链执行的难易程度不同

拦截器可以 preHandle方法内返回 false 进行中断

过滤器就比较复杂,需要处理请求和响应对象来引发中断,需要额外的动作,比如将用户重定向到错误页面

小结

简单总结一下,拦截器相比过滤器有更细粒度的控制,依赖于Spring容器,可以在请求之前或之后启动,过滤器主要依赖于servlet,过滤器能做的,拦截器基本上都能做。


附:Filter、Interceptor、aop拦截方向和抛出异常方向图


image.png

目录
相关文章
|
前端开发 Java 应用服务中间件
配置SpringMVC的前端控制器DispatcherServlet时,<url-pattern>中“/“和“/*“的区别
配置SpringMVC的前端控制器DispatcherServlet时,<url-pattern>中“/“和“/*“的区别
|
Java 编译器 Spring
Spring系列八:Spring AOP 和 AspectJ AOP 区别
该文章收录专栏: 叶秋学长的Spring系列专栏 博主传送门: 叶秋学长 Spring AOP 和 AspectJ AOP 区别? 今天由叶秋学长带领大家学习Spring AOP和AspectJ AOP 的区别~~ Spring AOP Spring AOP 属于运行时增强,主要具有如下特点: 1. 基于动态代理来实现,默认如果使用接口的,用 JDK 提供的动态代理实现,如果是方法则使用 CGLIB 实现 2. Spring AOP 需要依赖 IOC 容器来管理,并且只能作用于 Spring 容器,使用纯 Java 代码实现 3. 在性能上,由于 Spring AOP 是基于
265 1
Spring系列八:Spring AOP 和 AspectJ AOP 区别
|
XML 前端开发 Java
Spring MVC拦截器和过滤器的区别
你好看官,里面请!今天笔者讲的是Spring MVC拦截器和过滤器的区别。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
180 2
Spring MVC拦截器和过滤器的区别
|
设计模式 缓存 安全
面试官问 Spring AOP 中两种代理模式的区别,我懵逼了
基本介绍 代理模式是一种结构性设计模式。为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,并允许在将请求提交给对象前后进行一些处理。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 代理模式主要有三种不同的形式: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 动态代理(JDK 代理、接口代理):在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。 cglib 代理(可以在内存动态的创建对象,而不是实现接口,属于动态代理的范畴)
|
设计模式 Java 编译器
Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】
Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】
Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】
【小家java】POP(面向过程编程)、OOP(面向对象编程)、AOP(面向切面编程)三种编程思想的区别和联系(下)
【小家java】POP(面向过程编程)、OOP(面向对象编程)、AOP(面向切面编程)三种编程思想的区别和联系(下)
【小家java】POP(面向过程编程)、OOP(面向对象编程)、AOP(面向切面编程)三种编程思想的区别和联系(下)
|
算法 安全 JavaScript
【小家java】POP(面向过程编程)、OOP(面向对象编程)、AOP(面向切面编程)三种编程思想的区别和联系(上)
【小家java】POP(面向过程编程)、OOP(面向对象编程)、AOP(面向切面编程)三种编程思想的区别和联系(上)
【小家java】POP(面向过程编程)、OOP(面向对象编程)、AOP(面向切面编程)三种编程思想的区别和联系(上)
SpringMVC:拦截器和过滤器的区别
SpringMVC:拦截器和过滤器的区别
127 0
SpringMVC:拦截器和过滤器的区别
|
Java 容器
SpringMVC:过滤器和拦截器的区别和实现原理
SpringMVC:过滤器和拦截器的区别和实现原理
SpringMVC:过滤器和拦截器的区别和实现原理
|
设计模式 前端开发 Java
springmvc过滤器,拦截器,监听器作用与区别
springmvc过滤器,拦截器,监听器作用与区别
194 0
springmvc过滤器,拦截器,监听器作用与区别