

@Configuration
public class webConfig implements WebMvcConfigurer { //WebMvcConfigurer是一个Mvc的配置器
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor) //添加拦截器
.addPathPatterns("/**") //要拦截哪些方法
.excludePathPatterns(""); //哪些不进行拦截
}
}
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("目标方法执行前");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("目标方法执行后");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
@Configuration
public class webConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login");
}
}



程序启动后,拦截器会初始化DispatcherServlet


DispatcherServlet的 init 阶段:



DispatcherServlet的 service 阶段:



DispatcherServlet的 destory 阶段:
什么是适配器模式:


适配器模式的实现:

应用场景:版本升级
效果:使每一个接口返回的数据都是同种格式的
实现方法:使用@ControllerAdvice注解 + ResponseBodyAdvice接口 + 重写两个方法

当前代码存在的问题:


为什么返回结果为String时,后端无法正确执行:


上述问题的解决方法:

为什么用了ObjectMapper后,可以解决String的问题:

统一数据返回格式的优点:
为什么要有统一异常:自己的错误自己知道即可,不给外界知道
什么时候统一异常不会生效:如果代码已经手动用try-catch捕获了,就不会被我们写的【统一异常处理】捕获到了,如果没有手动捕获,才会被统一处理
针对的对象:主要针对的是运行时异常
代码:

@ControllerAdvice注解分析

为什么统一异常代码能生效:




如何阅读源码:注意源码的版本匹配


