攔截器HandlerInterceptorAdapter實現性能監控

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>
訪問時間太長的記錄下來
發佈了98 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章