背景,项目引入了swagger-ui,但是由于客户对安全性的要求,不让访问swagger的/v2/api-docs接口,由于swagger在项目底层的jar包配置类中引入,不想修改底层jar包,想用拦截器处理。编写拦截器之后发现/v2/api-docs接口未被拦截,仍然正常访问,很是郁闷~_~!
思考片刻后怀疑是跳过了拦截器于是查资料发现:
Spring MVC拦截器是一种AOP(面向切面编程)技术,它允许开发者在请求处理的不同阶段插入自定义的处理逻辑。拦截器在请求到达Controller之前和之后执行,允许我们在处理请求和响应过程中添加额外的功能。由此发现拦截器是SpringMVC的功能,而如果是原生的Servlet可能不会被拦截。
基于此信息,随采用过滤器处理,拦截下了swagger的/v2/api-docs接口。可以理解为过滤器可以拦截Servlet原生请求。同时,验证Filter也还可以拦截SpringMVC的请求。
基于此决定好好整理下Filter和Interceptor原理区别:
Filter | Interceptor | |
出生不同 | 来自Servlet | 来自Spring |
使用范围不同 | 过滤器实现了javax.servlet.Filter接口,也就是说过滤器的实现依赖于Tomcat等容器,只能在Web项目中使用。 | 拦截器实现了org.springframework.web.servlet接口,由spring容器进行管理,并不依赖Tomcat等容器,既可以在web程序,也可以在非web程序中,比如Swing、Application等 |
实现原理 | 基于过滤器链接ApplicationFilterChain实现 | 基于反射 |
使用场景 | 字符编码设置、响应数据压缩(通用功能) | 是否登录判断、权限判断、日志等等(偏业务功能) |
触发时机不同: