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>
訪問時間太長的記錄下來