总体来说就是 两步
1. 编写拦截器
2. 注册拦截器
- 代码1 编写一个 拦截器
public class LogInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
// 调用时间:Controller方法处理之前
// 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
// 若返回false,则中断执行,注意:不会进入afterCompletion
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
// 调用前提:preHandle返回true
// 调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
// 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
// 备注:postHandle虽然post打头,但post、get方法都能处理
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
// 调用前提:preHandle返回true
// 调用时间:DispatcherServlet进行视图的渲染之后
// 多用于清理资源
}
}
- 注册拦截器
@Configuration
public class MvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**").excludePathPatterns();
}
}
实现一个 feign拦截器,用于设置请求header
代码 : 本实例用于设置header ti,并用logback 打印链路追踪日志
public class FeignRequestInterceptor implements RequestInterceptor {
/**
* 由于过滤器在拦截器之前执行,所以 tiLevel 逻辑一致此处
* @param requestTemplate
*/
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
String ti = request.getHeader(MdcUtils.TI);
String tiLevel = request.getHeader(MdcUtils.TI_LEVEL);
requestTemplate.header(MdcUtils.TI, ti);
MdcUtils.put(MdcUtils.TI,ti);
int targetTiLevel;
try{
targetTiLevel = StringUtils.isEmpty(tiLevel) ? 1 : Integer.parseInt(tiLevel) + 1;
} catch (Exception e){
targetTiLevel = 1;
}
MdcUtils.put(MdcUtils.TI_LEVEL, targetTiLevel+"");
requestTemplate.header(MdcUtils.TI_LEVEL, targetTiLevel + "");
}
}
}