拦截器编写:
package com.demon.springmvc.Interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 处理顺序:
* 前置处理:顺序
* 后置处理:逆序
* 完成之后处理:逆序
* */
public class FirstInterceptor implements HandlerInterceptor {
private Logger logger=LoggerFactory.getLogger(getClass());
/*
* 前置处理逻辑:如果前面遇到异常,不会继续执行下去
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//handler:每一个 API 请求,会对应到一个 handler 处理器
logger.info("[preHandle][handler({})]", handler);
return true;//如果返回false,不进行后续handler的执行
}
/*
* 后置处理逻辑,如果handler出现异常,不会执行
* */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("[postHandle][handler({})]", handler);
}
/*
* 请求处理完成后执行的逻辑,preHandler方法返回true才会执行
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("[afterCompletion][handler({})]", handler,ex);
}
}
package com.demon.springmvc.Interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SecondInterceptor implements HandlerInterceptor {
private Logger logger=LoggerFactory.getLogger(getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("[preHandle][handler({})]", handler);
return false;// 故意返回 false
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("[postHandle][handler({})]", handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("[afterCompletion][handler({})]", handler,ex);
}
}
package com.demon.springmvc.Interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ThirdInterceptor implements HandlerInterceptor {
private Logger logger=LoggerFactory.getLogger(getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("[preHandle][handler({})]", handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("[postHandle][handler({})]", handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("[afterCompletion][handler({})]", handler,ex);
throw new RuntimeException("故意抛个错误"); // 故意抛出异常
}
}
注册拦截器:
package com.demon.springmvc.config;
import com.demon.springmvc.Interceptor.FirstInterceptor;
import com.demon.springmvc.Interceptor.SecondInterceptor;
import com.demon.springmvc.Interceptor.ThirdInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SpringMVCConfiguration implements WebMvcConfigurer {
@Bean
public FirstInterceptor firstInterceptor(){
return new FirstInterceptor();
}
@Bean
public SecondInterceptor secondInterceptor(){
return new SecondInterceptor();
}
@Bean
public ThirdInterceptor thirdInterceptor(){
return new ThirdInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.firstInterceptor()).addPathPatterns("/**");
registry.addInterceptor(this.secondInterceptor()).addPathPatterns("/userController/currentUser");
registry.addInterceptor(this.thirdInterceptor()).addPathPatterns("/**");
}
}
controller:
package com.demon.springmvc.controller;
import com.demon.springmvc.VO.UserVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("userController")
public class UserController {
private Logger logger= LoggerFactory.getLogger(getClass());
//测试拦截器
@GetMapping("/doSomething")
public void doSomething(){
logger.info("doSomething");
}
@GetMapping("/currentUser")
public UserVo currentUser(){
logger.info("currentUser");
return new UserVo().setId(1).setName("demon").setPassword("root");
}
@GetMapping("/exception")
public void exception(){
throw new NullPointerException("kongzhizhen");
}
}
单个拦截器执行过程大致落下:
// 伪代码
Exception ex = null;
try {
// 前置处理
if (!preHandle(request, response, handler)) {
return;
}
// 执行处理器,即执行 API 的逻辑
handler.execute();
// 后置处理
postHandle(request, response, handler);
} catch(Exception exception) {
// 如果发生了异常,记录到 ex 中
ex = exception;
} finally {
afterCompletion(request, response, handler);
}
唯一区别点:如果前置处理(preHandle)返回的是false,完成后处理(afterCompletion)不会执行。