1. 自定义一个拦截器,关键在HandlerInterceptorAdapter
import com.mmall.util.JsonMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; @Slf4j public class HttpInterceptor extends HandlerInterceptorAdapter { private static final String START_TIME = "requestStartTime"; /** * 请求前 * @param request * @param response * @param handler * @return true表示请求前都是ok的 * @throws Exception */ @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; } /** * 正常请求会调用 * 场景: * 1.输出每次的请求信息 * 2.监控某个方法耗费事件 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @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(); } /** * 正常和异常都会调用即100%调用 * @param request * @param response * @param handler * @param ex * @throws Exception */ @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();; } }
2. 注册
<mvc:interceptors> <bean class="com.allen.interceptor.HttpInterceptor" /> </mvc:interceptors>