Springboot过滤器Filter和拦截器Inteceptor的区别?
2 个回答
生活就是这样,别人看到的是结果,而自己撑的是整个过程。Hobbit霍比特人过滤器和拦截器在 Spring Boot 中功能类似,但它们之间有较大的区别,具体如下: 1. **触发时机不同** - 过滤器是在请求进入容器后、进入 Servlet 前进行预处理,在 Servlet 处理完后,返回给前端前执行后处理。 - 拦截器是 Spring 提供的,触发时机在请求进入控制器前、控制器方法执行后、视图渲染前后。 2. **获取 Spring 容器中的 Bean** - 拦截器可以访问 IOC 容器中的 Bean,因此可以在拦截器中注入服务类进行业务逻辑处理。 - 过滤器无法访问 Spring 管理的 Bean,因为它是 Java EE 标准的一部分,只需依赖 `Servlet API`,不依赖 Spring。 3. **实现机制不同** - 过滤器的实现基于回调机制。 - 拦截器的实现基于代理模式,通过反射实现。 4. **依赖关系** - 过滤器依赖于 Servlet 容器,属于 Servlet 规范的一部分。 - 拦截器可以独立存在,不依赖于 Servlet,可以在 Java EE 和 Java SE 环境中使用。 5. **执行机制不同** - 过滤器的执行由 Servlet 容器回调完成。 - 拦截器通常通过动态代理(反射)的方式来执行。 6. **生命周期管理** - 过滤器的生命周期由 Servlet 容器管理。 - 拦截器由 IoC 容器管理,可以通过注入等方式获取其他 Bean 的实例,使用更方便。 ### 过滤器和拦截器的简单区别 1. 过滤器可以修改请求(`HttpServletRequest`),但拦截器不行。 2. 过滤器需在 Servlet 容器中实现,而拦截器适用于 Java EE、Java SE 等各种环境。 3. 拦截器可以调用 IOC 容器中的依赖,而过滤器不行。 4. 过滤器只能在请求的前后使用,而拦截器可以详细到控制器方法级别。 ### 总结 - **过滤器**:用于筛选出请求中所需的部分内容(例如 `request` 中的某部分)。 - **拦截器**:通常用于安全控制,可以终止请求流程。 此外,过滤器和拦截器在作用范围上也有区别: - **过滤器(Filter)**:可以获取原始的 HTTP 请求,但无法获取请求控制器和方法的信息。 - **拦截器(Interceptor)**:可以获取请求控制器和方法的信息,但无法获取方法参数。 - **切面(Aspect)**:可以获取方法参数,但无法获取 HTTP 请求和响应对象。  ### 总体总结 - **过滤器**:筛选请求中所需内容,适用于全局功能,例如日志记录、跨域处理、编码设置等。 - **拦截器**:常用于安全控制,可以终止流程,适用于控制请求进入控制器的流程。 编辑于 2023-03-27 10:29 •IP属地 美国举报评论收藏
只有行动才能说明一切。楚风在 Spring Boot 中,**过滤器(Filter)** 和 **拦截器(Interceptor)** 都可以用于拦截和处理 HTTP 请求,但它们在使用方式、应用层次、以及实现机制上有明显的区别。以下是它们的主要区别: ### 1. 执行顺序和作用层次不同 - **过滤器(Filter)**:属于 Servlet 规范的一部分,作用于最外层。过滤器是在请求进入 Spring 容器之前执行的,也可以用于处理响应。过滤器可以在请求到达 Spring MVC 控制器之前,拦截和修改请求内容,或者在响应返回客户端之前,修改响应内容。它们可以作用于整个应用的请求和响应链。 - **拦截器(Interceptor)**:属于 Spring MVC 体系,作用在 Spring 容器内部。拦截器是在请求进入控制器之前、处理完成之后,以及视图渲染之前执行的。拦截器通常用于控制请求的预处理和后处理,特别适合处理和控制 MVC 层的请求。 ### 2. 使用场景 - **过滤器(Filter)**:适合做一些底层、跨整个应用的全局任务,例如:用户认证、日志记录、编码处理、跨域处理等。过滤器在 Servlet 容器的层级工作,因此能作用于所有进入应用的请求,包括静态资源(如 HTML、CSS、JavaScript 文件)等。 - **拦截器(Interceptor)**:适合用于与业务逻辑相关的请求拦截,例如用户权限检查、日志记录、计时统计等。拦截器只能拦截被 Spring 管理的请求(即进入控制器的请求),并且通常不影响静态资源。 ### 3. 生命周期和执行时机 - **过滤器(Filter)**:在 Servlet 容器初始化时被加载一次,整个应用运行期间都会存在。当一个请求进来时,过滤器首先执行,然后再进入 Spring 容器。如果设置多个过滤器,它们会按照配置顺序执行。 - **拦截器(Interceptor)**:在 Spring 容器加载时被加载。拦截器的 `preHandle` 方法在请求进入控制器前执行,`postHandle` 在控制器执行完后执行,而 `afterCompletion` 则在视图渲染完成后执行。 ### 4. 使用方法和配置方式 - **过滤器(Filter)**:通常通过实现 `javax.servlet.Filter` 接口来定义,然后通过在配置类中使用 `@Bean` 注册,或者使用 `@WebFilter` 注解来配置。 ```java @Component public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 处理请求 chain.doFilter(request, response); // 处理响应 } } ``` ```java @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MyFilter> myFilter() { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(new MyFilter()); registration.addUrlPatterns("/*"); // 过滤所有请求 return registration; } } ``` - **拦截器(Interceptor)**:通过实现 `HandlerInterceptor` 接口来定义拦截器,然后通过 `WebMvcConfigurer` 的 `addInterceptors` 方法来配置。 ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 请求进入控制器之前执行 return true; // 返回 true 才会继续执行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // 控制器执行后,视图渲染前执行 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 视图渲染后执行 } } ``` ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 拦截所有请求 } } ``` ### 5. 应用优先级 - **过滤器**的优先级高于拦截器。过滤器在请求进入 Spring 容器之前就会执行,而拦截器只会拦截 Spring 管理的请求,因此过滤器的作用范围更广。 - 如果在同一个请求上使用了过滤器和拦截器,过滤器会先执行,之后再进入拦截器处理。 ### 总结 | 特性 | 过滤器(Filter) | 拦截器(Interceptor) | |------------------|----------------------------------------|-----------------------------------------| | 作用层次 | 基于 Servlet 容器 | 基于 Spring MVC | | 适用场景 | 全局过滤、日志、跨域、编码、认证等 | 权限检查、日志、计时等 MVC 相关操作 | | 生命周期 | Servlet 容器加载 | Spring 容器加载 | | 影响对象 | 所有请求(包括静态资源) | 仅限 Spring 管理的请求 | | 执行顺序 | 优先于拦截器执行 | 过滤器之后,控制器处理之前和之后 | | 配置方式 | 实现 `Filter` 接口,注册到 Servlet 容器 | 实现 `HandlerInterceptor` 接口,注册到 Spring | 总之,过滤器和拦截器各自有不同的职责。过滤器适用于全局、较底层的任务,而拦截器适用于业务逻辑控制。发布于 2022-09-18 12:39 •IP属地 广西举报评论收藏
公众号进入网站体验更佳

