拦截器
用于拦截用户的请求,在指定方法前后,根据业务需要执行预设的代码
定义拦截器
实现HandlerInterceptor接口,并重写所有方法
preHandle() 目标方法执行前执行,返回true,继续往后执行;返回false,中断后续操作
afterCompletion() 视图渲染完毕后执行
注册拦截器
实现WebMvcConfigurer接口
addInterceptors() 添加拦截器对象
addPathPatterns() 指定拦截哪些请求
excludePathPatterns() 指定不拦截哪些请求
拦截路径:
/* :一级路径 能匹配/user 不能匹配/user/login
/** :任意级路径
/book/*:book下的一级路径,能匹配/book/addBook 不能匹配/book /book/addBook/1
/book/**:book下任意级路径
执行流程

所有的请求都会先进入DispatcherServlet,并执行doDisPatch调度方法。如果有拦截器会先执行所有的拦截器preHandle方法,返回true,继续访问controller中的方法。controller中的方法执行完毕之后,再返回来执行postHandle和afterCompletion,返回给DispatcherServlet。最后给浏览器返回数据
适配器模式
将一个类的接口,包装成用户期望的另一个接口。就是目标类不能直接使用,用一个新类包装一下,用户通过访问新类来访目标类
DispatcherServlet和slf4j都体现了适配器模式
统一数据返回格式
使用方法
-
实现ResponseBodyAdvice接口,并重写所有方法
- supports():判断是否要执行beforeBodyWrite
returnType.getMethod():获取正在执行的方法returnType.getMethod().getDeclaringClass():获取正在执行的类
returnType.getParameterType():获取方法期待的返回值
- beforeBodyWrite(): 对返回值进行具体操作处理
-
在类上加上
@ControllerAdvice注解,表示控制器通知类 -
加上
@ResponseBody注解,表示要返回的是一个数据
String的特殊处理
如果方法的返回值为String类型,需要使用objectMapper.writeValueAsString()将其转换为字符串返回,此时如果返回的结果是一个对象,需要将响应头的Content-Type设置为application/json
java
@RequestMapping(value="updateBook",produces="application/json")
统一异常处理
使用方法
- 在类上加上
@ControllerAdvice注解,表示控制器通知类 @ExceptionHandler方法注解,代表这个方法为异常处理器- 如果要返回数据,还需加上
@ResponseBody
针对不同异常返回不同结果
当有多个异常通知时,匹配顺序为从具体的当前类依次向上匹配
@ExceptionHandler
public Object handle(Exception e){
...
}
@ExceptionHandler
public Object handle(NullPointerException e){
...
}
@ExceptionHandler
public Object handle(IndexOutOfBoundsException e){
...
}