spring boot 拦截器和过滤器区别

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(728)   2024-04-17 10:32:10

Spring Boot中的拦截器和过滤器都是用于在请求到达控制器之前或之后对请求进行处理的。

3.0.5

区别如下:

  1. 拦截器是基于Java的反射机制,而过滤器是基于函数回调。

  2. 拦截器只能对Spring MVC的请求进行拦截,而过滤器可以拦截所有的请求。

  3. 拦截器可以访问控制器中的模型和视图,而过滤器不能。

  4. 拦截器可以在请求到达控制器之前或之后执行逻辑,而过滤器只能在请求到达Servlet容器之前或之后执行逻辑。

  5. 拦截器可以通过实现HandlerInterceptor接口来自定义拦截器,而过滤器需要实现Filter接口。

总之,拦截器和过滤器都是用于对请求进行处理的,但是它们的实现方式和作用范围略有不同。在使用时,应根据具体情况选择合适的拦截器或过滤器。

 

代码实列说明

首先,我们来创建一个拦截器,实现HandlerInterceptor接口:

@Component
public class MyInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求处理前执行");
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("请求处理后执行");
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("请求完成后执行");
    }
}

然后,我们来创建一个过滤器,实现Filter接口:

@Component
public class MyFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("请求处理前执行");
        chain.doFilter(request, response);
        System.out.println("请求处理后执行");
    }
 
    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

最后,我们来创建一个Controller,用于测试拦截器和过滤器:

@RestController
public class TestController {
 
    @GetMapping("/test")
    public String test() {
        System.out.println("处理请求");
        return "success";
    }
}

在上面的代码中,我们创建了一个拦截器和一个过滤器,并在Controller中创建了一个用于测试的请求处理方法。

接下来,我们需要将拦截器和过滤器添加到Spring Boot中。在Spring Boot中,可以通过@Configuration注解来实现。

首先,我们来添加拦截器:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
 
    @Autowired
    private MyInterceptor myInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/test");
    }
}

在上面的代码中,我们通过@Configuration注解来声明一个配置类,实现WebMvcConfigurer接口,并在其中添加了我们的拦截器。

接下来,我们来添加过滤器:

@Configuration
public class FilterConfig {
 
    @Autowired
    private MyFilter myFilter;
 
    @Bean
    public FilterRegistrationBean<MyFilter> filterRegistrationBean() {
        FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(myFilter);
        registrationBean.addUrlPatterns("/test");
        return registrationBean;
    }
}

在上面的代码中,我们通过@Configuration注解来声明一个配置类,并在其中添加了我们的过滤器。

最后,我们启动应用程序并访问/test接口,可以看到控制台输出的结果:

过滤器初始化
请求处理前执行
处理请求
请求处理后执行
请求完成后执行

从上面的输出结果可以看出,拦截器和过滤器都可以在请求处理前和请求处理后执行逻辑。但是,拦截器还可以在请求完成后执行逻辑。另外,过滤器还可以在请求到达Servlet容器之前执行逻辑。

 

地址:https://www.leftso.com/article/1641338652304871425.html

相关阅读

Spring Boot中的拦截器和过滤器都是用于在请求到达控制器之前或之后对请求进行处理的。区别如下:拦截器是基于Java的反射机制,而过滤器是基于函数回调。拦截器只能对Spring MVC的请...
Java编程中spring boot项目动态添加拦截器Interceptor
学习创建和配置使用JSP 模板文件渲染视图层的Spring Boot jsp 视图解析器
Spring Boot 1.x升级到Spring Boot 2.0迁移指南
Spring Boot 入门 AOP 日志处理,这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring 框架的处理也是一样。综合来讲,本文主要讲解了spring b...
Spring Boot 2.0,Spring框架的Spring Boot 中的Spring Boot Actuator变化讲解。并且了解如何在Spring Boot 2.0中使用Actuator...
引言    通过之前spring boot mybatis 整合的讲解: spring boot mybaties整合  (spring boot mybaties 整合 基于Java注解方式写...
Spring Boot 2.0 绑定properties属性资源文件 Spring Boot 2.0 读取properties配置文件值 Spring Boot 2.0获取properties配...
spring boot 1.5整合redis实现spring的缓存框架,spring boot,redis
spring boot 入门之spring session实现restful apis。通过spring boot或者spring mvc整合spring session的方式来实现sessio...