package learn.interceptors; import org.apache.log4j.Logger; import org.springframework.core.NamedThreadLocal; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestInteceptor extends HandlerInterceptorAdapter { private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("StopWatch-StartTime"); private static final Logger log =Logger.getLogger(TestInteceptor.class); public boolean contain(String url){ if(url.startsWith("/logger")){ return true; } return false; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { startTimeThreadLocal.set(System.currentTimeMillis()); System.out.println("==判断是否拦截=="); //过滤拦截请求 if(contain(request.getRequestURI())){ System.out.println("不拦截"); return true; } System.out.println("拦截"); request.setAttribute("msg", "注册开放时间:9:00-12:00"); request.getRequestDispatcher("/interceptor.jsp").forward(request, response); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("lanjiezhong...."); super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long time=System.currentTimeMillis()-startTimeThreadLocal.get(); System.out.println(time); if(time>0){ log.error(request.getRequestURI()+"访问时间太长:"+time); } super.afterCompletion(request, response, handler, ex); } }
<!--配置拦截器, 多个拦截器,顺序执行 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="learn.interceptors.TestInteceptor" /> </mvc:interceptor> <!-- 当设置多个拦截器时,先按顺序调用 preHandle 方法,然后逆序调用每个拦截器的 postHandle 和 afterCompletion 方法 --> <!-- path 匹配的是 url 路径, 如果不配置或/**, 将拦截所有的Controller --> <!-- 先进入拦截器的 preHandle 方法,再加入 Controller 方法 --> </mvc:interceptors>访问时间太长的记录下来