springboot中拦截器和过滤器有什么区别呢?

重生 SpringBoot 发布时间:2023-12-25 11:41:05 阅读数:16716 1
下文笔者讲述SpringBoot中拦截器和过滤器的区别说明,如下所示
springBoot中我们经常需要编写拦截器和过滤器
    那么他们之间有什么区别呢?
    下文笔者将一一道来,如下所示

一、拦截器

拦截器
   在处理器执行之前
     对请求进行预处理和后处理的对象
        在Spring Boot中
        通过实现HandlerInterceptor接口来创建拦截器
          拦截器可以在请求被传递到controller之前和controller处理完请求之后
            对请求进行各种操作
             如:
               记录日志、鉴权、修改请求参数等等。

拦截器的执行顺序是
   按照注册顺序执行的
      先注册的拦截器先执行
        拦截器可以拦截某一种或某几种请求
          也可以拦截所有请求
例:
创建一个拦截器实现类MyInterceptor

public class MyInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器 preHandle 方法执行");
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器 postHandle 方法执行");
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器 afterCompletion 方法执行");
    }
}

//在配置类中注册该拦截器

@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**"); // 拦截所有请求
        // 或者 registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**"); 拦截/api下的请求
    }
}

二、过滤器

过滤器是
   在请求进入Servlet容器之前和Servlet返回响应之前被调用
    用于对请求和响应进行处理

在Spring Boot中
   通过实现Filter接口来创建过滤器

过滤器的功能:
   对请求进行预处理和后处理
     如:
       字符集编码、XSS防护、CSRF防护、gzip压缩等等。

过滤器的运行顺序:
   按照在web.xml文件中配置的顺序执行的
     过滤器可以拦截所有请求。
创建一个过滤器实现类MyFilter

public class MyFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) {
        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("过滤器销毁");
    }
}

//web.xml文件中配置该过滤器:

    MyFilter
    com.example.demo.filter.MyFilter
 
 
    MyFilter
    /* // 拦截所有请求
    // 或者 /api/* 仅拦截/api下的请求
总结:
 1.拦截器
    基于Java的反射机制实现的
        属于SpringMVC框架提供的功能
          只能拦截Controller层的请求
           不能拦截到静态资源;
而过滤器
   依赖于Servlet容器实现的
     可以拦截到所有的请求
       包括静态资源。

2.拦截器的运行顺序
    根据注册顺序依次执行的
而过滤器的运行顺序
    根据在web.xml文件中配置顺序运行

3.拦截器可以修改请求参数和返回结果
    如:
      修改请求头、添加响应头等操作

而过滤器只能修改请求参数和响应结果
   如:
     修改编码格式、压缩响应等操作
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202312/7568.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者