Spring Boot中的拦截器和过滤器都是用于在请求到达控制器之前或之后对请求进行处理的。
区别如下:
拦截器是基于Java的反射机制,而过滤器是基于函数回调。
拦截器只能对Spring MVC的请求进行拦截,而过滤器可以拦截所有的请求。
拦截器可以访问控制器中的模型和视图,而过滤器不能。
拦截器可以在请求到达控制器之前或之后执行逻辑,而过滤器只能在请求到达Servlet容器之前或之后执行逻辑。
拦截器可以通过实现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