springboot中拦截器和过滤器有什么区别呢?
下文笔者讲述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.拦截器可以修改请求参数和返回结果 如: 修改请求头、添加响应头等操作 而过滤器只能修改请求参数和响应结果 如: 修改编码格式、压缩响应等操作
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。