Springboot 过滤器 拦截器 全局异常处理
所属分类 spring
浏览量 112
一 过滤器(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