首页  

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