Filter与Interceptor的区别-牛翰网

Filter与Interceptor的区别

前言
在看springboot项目时,其中的会话持续时,了解到token,session,jwt等方法,但是接着我就了解到过滤器(Filter)以及拦截器(Interceptor),感觉这两个东西真的有够像的了,也是去看了好多篇文章。接下来就分别讲一下,Filter与Interceptor,最后讲一下两者的区别。(本篇参考了几篇博客,我会在对应处留下链接的)

过滤器(Filter)
基于Servlet实现,是将java web传入的request、以及响应的response提前过滤掉一些信息或设置一点参数。
Filter过滤器随web应用的启动而启动,且只初始化一次。

Filter接口内,需实现init、doFilter以及destroy方法

void init(FilterConfig filterConfig):容器启动会调用用于初始化,整个程序运行期只会被调用一次。

void doFilter(ServletRequest request, ServletResponse response,FilterChain chain):doFilter为具体的过滤功能代码。

void destroy():当Filter 要销毁时,进行相关资源的回收工作。

拦截器(Interceptor)

是SpringMVC中实现的一种基于Java反射,是在Action执行的前后执行一段代码或执行前阻止其执行。

需实现preHandle、postHandle以及afterCompletion方法
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):在请求前被调用。就如我们开始说的jwt的问题,在执行操作之前会先要验证用户的登录信息,这个就可以在这个方法中实现,如果验证成功则返回 true,继续执行数据操作业务;否则就返回 false,后续操作数据的业务就不会被执行了。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):调用请求方法之后执行,但它会在 DispatcherServlet (前端控制器)进行渲染视图之前被执行。
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):会在请求结束之后再执行,也就是在 DispatcherServlet (前端控制器)渲染了对应的视图之后再执行。

主要区别
1.Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理。
2.过滤器是在请求进入容器后、进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
就是过滤器会先执行,然后才会执行拦截器,执行时机不同。
(图片来源https://cloud.tencent.com/developer/article/2142914)
图片[1]-Filter与Interceptor的区别-牛翰网
3.最简单明了的区别(参考https://zhuanlan.zhihu.com/p/340397290)
过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象

4.使用场景

拦截器使用场景:
登录验证,判断用户是否登录。
权限验证,判断用户是否有权限访问资源,如校验token

过滤器使用场景:
URL级别的权限访问控制
过滤敏感词汇(防止sql注入)
设置字符编码

最后我看到一个问题:拦截器只能拦截部分web请求,这句话怎么理解?(https://segmentfault.com/a/1190000037755221#item-4-1)
拦截器的拦截,是基于java反射机实现,拦截对象只能是实现了接口的类,而不能拦截url这种链接

来源链接:https://www.cnblogs.com/l-xx123/p/18857426

请登录后发表评论

    没有回复内容