最近在踩一个项目是spring+jsp的,但是我准备改成spingboot+html的形式,其中有一个自定义拦截器的工具,改动过程中的坑 记录下来。
首先是是MVCconfig的配置类
@Configuration
public class MVCconfig implements WebMvcConfigurer {
/**
* 第一种方式注入
* @return
*/
@Bean
public HttpInterceptor getHttpInterceptor(){
return new HttpInterceptor();
}
/**
*第二种 方式,这种方式下 HttpInterceptor 类上 需要添加 @Component 注解
*/
// @Resource
// private HttpInterceptor httpInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//增加拦截器 第一种
registry.addInterceptor(getHttpInterceptor()).addPathPatterns("/**");
//第二种
// registry.addInterceptor(httpInterceptor).addPathPatterns("/**");
}
}
自定义拦截器的实现,根据上面的方案 决定是不是需要加@Component 注解
//@Component
public class HttpInterceptor extends HandlerInterceptorAdapter {
private static final String START_TIME = "requestStartTime";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI().toString();
Map parameterMap = request.getParameterMap();
log.info("request start. url:{}, params:{}", url, JsonMapper.obj2String(parameterMap));
long start = System.currentTimeMillis();
request.setAttribute(START_TIME, start);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
String url = request.getRequestURI().toString();
long start = (Long) request.getAttribute(START_TIME);
long end = System.currentTimeMillis();
log.info("request finished. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String url = request.getRequestURI().toString();
long start = (Long) request.getAttribute(START_TIME);
long end = System.currentTimeMillis();
log.info("request completed. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
public void removeThreadLocalInfo() {
//RequestHolder.remove(); //释放资源
}
}
可以试试 拦截器是不是起作用了,打印如下