Springboot 过滤器 拦截器 全局异常处理  
   
所属分类 spring
浏览量 509
一 过滤器(Filter)
Java Web三大组件 Servlet Filter Listener 
Filter 使用场景 
登录校验,统一编码处理,敏感字符处理等
1.定义过滤器
实现 javax.servlet.Filter接口 
2.配置过滤器
加 @WebFilter 注解,配置拦截资源的路径, 引导类加@ServletComponentScan 
拦截器Filter的核心方法是 doFilter()
@WebFilter  urlPatterns属性 
urlPatterns = "/*" 配置过滤所有请求
3.OncePerRequestFilter
实际使用中推荐使用OncePerRequestFilter ,Spring框架提供的一个抽象类,用于确保过滤器在每个请求中只被调用一次
它继承自GenericFilterBean类,并在 doFilter 方法中添加了对请求是否已被过滤的判断逻辑。
OncePerRequestFilter 和 Filter 的根本区别
OncePerRequestFilter 确保过滤器在每个请求中只被调用一次 ,Filter本身并没有提供这样的机制。
使用OncePerRequestFilter的实现类,不需要在启动类上增加@ServletComponentScan注解
二 拦截器(Interceptor)
1.拦截器概述
拦截器是一种动态拦截方法调用的机制,与过滤器类似。是Spring框架中提供的,用来动态拦截控制器方法的执行。
它的主要作用是拦截请求,在指定的方法前后调用,根据业务需要执行预先设定的代码。
2.定义拦截器(Interceptor)
定义一个拦截器,继承HandlerInterceper,并实现其方法。
HandlerInterceptor中的方法都提供了默认实现,可根据业务需求来决定重写哪些方法。
注意要为拦截器添加@Component注解,将其交给IOC容器管理。
HandlerInterceptor是SpringMVC框架中的拦截器接口,用于拦截请求的处理过程并进行响应的处理
3.注册拦截器
自定义的拦截器,需要进行注册。可实现WebMvcConfigurer 接口,实现 addInterceptors方法,为其添加新的拦截器。
@Configuration
public class SpringWebConfigurer implements WebMvcConfigurer {
    //方式1:如果在定义拦截器的时候已经添加了@Component注解,则直接使用注入的方式,将拦截器对象注册到InterceptorRegistry对象中
    @Resource
    private CustomInterceptor customInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 使用 addPathPatterns 添加拦截路径,支持数组
        // /**表示拦截所有资源, AntPathMatcher 
        //方式1:使用注入的对象
        registry.addInterceptor(customInterceptor).addPathPatterns("/**");
        //方式2:直接创建对象,添加到InterceptorRegistry对象中
        registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**");
    }
}
InterceptorRegistry是Spring框架中专门用来管理拦截器的集合类。
通过InterceptorRegistry对象,可以添加拦截器。并且指定它们的执行顺序。
WebMvcConfigurer是Spring框架中用于配置Mvc特性的接口,
通过实现WebMvcConfigurer接口,可以对SpringMVC进行自定义配置,包括添加拦截器,资源处理器,视图解析器等。
addPathPatterns     配置需要拦截的资源路径
excludePathPatterns 配置不需要拦截的资源路径
4.AntPathMatcher
Ant风格的路径模式匹配,AntPathMatcher支持以下通配符:
? 匹配一个字符
* 匹配0个或多个字符
** 匹配0个或多个目录
5.拦截路径
拦截路径说明 
/*     一级路径     匹配 /a /b /c  不匹配 /a/b 
/**    任意路径
/a/*   /a/  开头的一级路径
/a/**  /a/  开头的任意路径
6.过滤器和拦截器的执行流程
浏览器 / filter / dispatcherServlet / Interceptor / Controller
dispatcherServlet  将请求并分派到相应的Controller 处理
配置
URL映射,视图解析,异常处理等
浏览器发送请求,先到过滤器(Filter)
过滤器(Filter)放行之后,HTTP请求经过dispatcherServlet的派发到达拦截器(Interceptor)
拦截器(Interceptor)放行之后,到 Controller
Controller 生成响应结果,将结果返回到拦截器(Interceptor)
拦截器(Interceptor)最后再将结果返回过滤器(Filter)
最后响应浏览器
7.过滤器和拦截器的区别
接口规范不同:过滤器需要实现Filter接口;而拦截器需要实现HandlerInterceptor接口,并且需要注册到InterceptorRegistry集合中
拦截范围不同:过滤器会拦截所有的请求资源;而拦截器只会拦截Spring环境中的资源。
三 全局异常处理
@RestControllerAdvice 
@ExceptionHandler 表明要捕获的异常类型
Result是一个自定义的统一响应格式类,其中包含了响应代码,响应消息,和响应数据
为保证返回格式统一,使用Result作为返回类型。
@ControllerAdvice  @ResponseBody
使用 @RestControllerAdvice 统一处理异常,返回统一的错误信息
@ExceptionHandler:定义方法来处理特定类型的异常
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
    static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    @ExceptionHandler(value = Exception.class)
    public Object handleException(Exception ex) {
        LOG.error("GlobalExceptionHandler_handleException",ex);
        return ex+"";
    }
}
 springboot 使用 servlet 过滤器  
 springboot 使用 拦截器   
 Spring ProxyFactory 和 方法拦截器 MethodInterceptor   
 SpringMVC @ControllerAdvice 注解    
 上一篇  
   
 下一篇  
 JdbcTemplate BeanPropertyRowMapper 使用 
 家常炒挂面 
 JPA常用注解 
 jackson 笔记 
 mybatis之MappedStatement getBoundSql 
 Mybatis SqlSource 与 BoundSql