简介
在实际的开发中,我们经常需要对请求进行拦截和过滤来进行一些通用的操作,比如权限验证、请求日志记录等。在 SpringBoot 中,我们可以使用拦截器(Interceptor)和过滤器(Filter)来实现这些功能。
过滤器(Filter)
过滤器是在请求进入 Servlet 容器之前或者响应返回给客户端之前对请求或响应进行预处理或后处理的组件。
过滤器的目的
过滤器的目的是让开发者可以重用一些通用的逻辑,这些逻辑可以被部署在多个应用中,达到统一的处理效果。
过滤器的常见应用场景
- 验证用户身份,比如登录验证。
- 记录日志,比如记录请求的参数、请求的 URL、响应时间等信息。
- XSS 攻击防范,对请求或响应的参数进行过滤,防止恶意脚本注入。
- 统一字符编码处理,比如将请求或响应中的字符集统一转换为 UTF-8。
- 请求转发等。
过滤器的实现方式
- 实现
javax.servlet.Filter
接口。 - 注册过滤器,可以使用
@WebFilter
注解或者在配置类中手动进行配置。
过滤器的执行顺序
与过滤器的注册顺序一致,先注册的过滤器先执行。
拦截器(Interceptor)
拦截器是 Spring 框架提供的用于拦截请求进行处理的组件。
拦截器的目的
拦截器的目的是在请求进入 SpringMVC 的 DispatcherServlet 之前或者响应返回给客户端之前,对请求或响应进行处理。
拦截器的常见应用场景
- 权限验证,比如对一些需要权限的请求进行拦截。
- 参数校验,对请求参数进行验证。
- 请求日志记录,记录请求的 URL、请求参数、响应结果等信息,方便排查问题。
- 统一异常处理。
- 统一返回格式处理,比如将返回的数据统一封装成 JSON 格式。
拦截器的实现方式
- 实现
org.springframework.web.servlet.HandlerInterceptor
接口。 - 注册拦截器,可以使用
WebMvcConfigurer
的addInterceptors
方法进行配置。
拦截器的执行顺序
拦截器的执行顺序与其在配置类中的注册顺序有关,先注册的拦截器先执行。
拦截器和过滤器的区别与选择
拦截器和过滤器有很多相似的地方,但也有一些区别:
- 拦截器是基于 Java 反射机制实现的,而过滤器是基于函数回调实现的。
- 拦截器依赖于 Web 框架,如 SpringMVC,而过滤器不依赖于任何框架。
- 拦截器对 Controller 层起作用,过滤器对所有请求起作用。
- 拦截器可以获取 Spring 容器中的 Bean,而过滤器不可以。
选择拦截器还是过滤器,可以根据实际需求来决定。如果需要对请求进行更精细化的处理,比如根据不同的 URL 模式应用不同的拦截逻辑,可以使用拦截器。而对于一些通用的请求处理逻辑,可以使用过滤器。
总结
通过使用拦截器和过滤器,我们可以实现对请求的拦截与过滤,完成一些通用的操作,提高开发的效率。拦截器适用于对请求进行更精细化的处理,拦截器不依赖于任何框架,而过滤器则对所有请求起作用。在实际的项目开发中,我们可以根据需求选择使用拦截器或过滤器,或者同时使用两者来完成不同的任务。
本文来自极简博客,作者:绿茶味的清风,转载请注明原文链接:SpringBoot 中拦截器和过滤器的使用