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


