日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SpringMVC攔截器實(shí)現(xiàn)分析

一、Servlet Filter與Spring interceptor的執(zhí)行順序

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括觀山湖網(wǎng)站建設(shè)、觀山湖網(wǎng)站制作、觀山湖網(wǎng)頁制作以及觀山湖網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,觀山湖網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到觀山湖省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

Filter有順序嗎?我們怎么控制filter的執(zhí)行順序。通過Tomcat的代碼分析,servlet在Filter執(zhí)行完成后才調(diào)用,如有多個(gè)filter怎么控制執(zhí)行順序,首先會(huì)想到在web.xml配置某個(gè)參數(shù),例如order之類的,但查找一下一番,servlet并沒有這個(gè)參數(shù)。試試filter Mapping的配置的先后順序,果然有效,原來filter的執(zhí)行順序就考filter mapping在web.xml中的順序。

spring interceptor也是這樣的執(zhí)行順序,不過interceptor多一個(gè)配置參數(shù)order通過他也可以來實(shí)現(xiàn)interceptor的執(zhí)行順序。很多應(yīng)用場景中,執(zhí)行順序還是重要的,比如cache和transaction interceptor的執(zhí)行順序,很顯然cache應(yīng)該在transaction之前,這樣發(fā)現(xiàn)命中了就不用打開事務(wù),如果transaction在前,每次都打開事務(wù)即使cache命中,這是一個(gè)無謂東動(dòng)作。

二、利用springMVC的interceptor實(shí)現(xiàn)頁面性能監(jiān)控(Filter亦可)

調(diào)優(yōu)***步,找出耗時(shí)比較長的頁面進(jìn)行優(yōu)化。利用interceptor能輕易搞定。interceptor提供了preHandle和postHandle以及afterCompletion三個(gè)方法。preHandle調(diào)用controller具體方法之前調(diào)用,postHandle完成具體方法之后調(diào)用,afterCompletion完成對頁面的render以后調(diào)用,至此整個(gè)頁面渲染完成。也就是說我們在preHandle記錄開始的時(shí)間,在afterCompletion記錄結(jié)束的時(shí)間,就可或者整個(gè)頁面生成的時(shí)間。Spring自帶StopWatch工具類來實(shí)現(xiàn)時(shí)間跟蹤,關(guān)鍵一點(diǎn)interceptor不是線程安全的。我們需要借助threadlocal來實(shí)現(xiàn)線程安全。

 
 
 
  1. @Override 
  2.     public boolean preHandle(HttpServletRequest request, 
  3.             HttpServletResponse response, Object handler) throws Exception { 
  4.         if(usePerformance){ 
  5.             StopWatch stopWatch = new StopWatch(handler.toString()); 
  6.             stopWatchLocal.set(stopWatch); 
  7.             stopWatch.start(handler.toString()); 
  8.         } 
  9.          
  10.         return true; 
  11.     } 
  12.  
  13.  @Override 
  14.     public void afterCompletion(HttpServletRequest request, 
  15.             HttpServletResponse response, Object handler, Exception ex) 
  16.             throws Exception { 
  17.         if(usePerformance){ 
  18.             StopWatch stopWatch = stopWatchLocal.get(); 
  19.             stopWatch.stop(); 
  20.             String currentPath = request.getRequestURI(); 
  21.             String queryString  = request.getQueryString(); 
  22.             queryString = queryString == null ? "":"?" + queryString; 
  23.             log.info("access url path:" + currentPath + queryString +  " |time:" + stopWatch.getTotalTimeMillis()); 
  24.             stopWatchLocal.set(null); 
  25.         } 
  26.     } 

如果你沒有使用springMVC可以使用filter來完成:

 
 
 
  1. stopWatch.start(); 
  2. doFilterChain(); 
  3. stopWatch.stop(); 

三、SpringMVC 攔截器實(shí)現(xiàn)分析

SpringMVC的攔截器不同于Spring的攔截器,SpringMVC具有統(tǒng)一的入口DispatcherServlet,所有的請求都通過DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也沒有代理,同時(shí)SpringMVC管理的Controller也不有代理。哪不難想到我們在執(zhí)行controller之前做某些動(dòng)作,執(zhí)行完畢做某些動(dòng)作,render完成做某些動(dòng)作。SpringMVC的攔截器對應(yīng)提供了三個(gè)preHandle,postHandle,afterCompletion方法。只需在三個(gè)方法內(nèi)寫我們需要的邏輯就行,多了都是廢話,還是代碼實(shí)在。

 
 
 
  1. HandlerInterceptor[] interceptors = mappedHandler.getInterceptors(); 
  2.                 if (interceptors != null) { 
  3.                     for (int i = 0; i < interceptors.length; i++) { 
  4.                         HandlerInterceptor interceptor = interceptors[i]; 
  5. //ha.handle是調(diào)用具體的controller在此之前執(zhí)行preHandle                      if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) { 
  6.                             triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null); 
  7.                             return; 
  8.                         } 
  9.                         interceptorIndex = i; 
  10.                     } 
  11.                 } 
  12.  
  13.                 // Actually invoke the handler. 
  14.                 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 

完成調(diào)用之后,調(diào)用render(),***執(zhí)行afterCompletion()。

 
 
 
  1. if (interceptors != null) { 
  2.                 for (int i = interceptors.length - 1; i >= 0; i--) { 
  3.                     HandlerInterceptor interceptor = interceptors[i]; 
  4.                     interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv); 
  5.                 } 
  6.             } 
  7.         } 
  8.         catch (ModelAndViewDefiningException ex) { 
  9.             logger.debug("ModelAndViewDefiningException encountered", ex); 
  10.             mv = ex.getModelAndView(); 
  11.         } 
  12.         catch (Exception ex) { 
  13.             Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null); 
  14.             mv = processHandlerException(processedRequest, response, handler, ex); 
  15.             errorView = (mv != null); 
  16.         } 
  17.  
  18.         // Did the handler return a view to render? 
  19.         if (mv != null && !mv.wasCleared()) { 
  20.             render(mv, processedRequest, response); 
  21.             if (errorView) { 
  22.                 WebUtils.clearErrorRequestAttributes(request); 
  23.             } 
  24.         } 
  25.         else { 
  26.             if (logger.isDebugEnabled()) { 
  27.                 logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() + 
  28.                         "': assuming HandlerAdapter completed request handling"); 
  29.             } 
  30.         } 
  31.  
  32.         // Trigger after-completion for successful outcome. 
  33.         triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null); 

原文鏈接:http://exceptioneye.iteye.com/blog/1267248


網(wǎng)站題目:SpringMVC攔截器實(shí)現(xiàn)分析
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/djojspd.html