程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 通過攔截器Interceptor實現Spring MVC中Controller接口訪問信息的記錄,interceptormvc

通過攔截器Interceptor實現Spring MVC中Controller接口訪問信息的記錄,interceptormvc

編輯:JAVA綜合教程

通過攔截器Interceptor實現Spring MVC中Controller接口訪問信息的記錄,interceptormvc


java web工程項目使用了Spring+Spring MVC+Hibernate的結構,在Controller中的方法都是用於處理前端的訪問信息,Controller通過調用Service進行業務處理後給前端返回ModelAndView對象或者只返回Json格式數據。如果能夠獲得Http請求在後端程序中處理的相關信息,對於開發和調試時十分方便的。工程中使用了Spring MVC的Interceptor對所有Http請求及其響應進行攔截,從而獲取到本次訪問接口信息以及程序處理時長等信息,特意在此記錄一下實現方式。

 1 package com.api.web.interceptor;
 2 
 3 import java.util.Arrays;
 4 import java.util.Date;
 5 import java.util.Map;
 6 import java.util.Map.Entry;
 7 
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 import org.apache.log4j.Logger;
12 import org.springframework.web.method.HandlerMethod;
13 import org.springframework.web.servlet.HandlerInterceptor;
14 import org.springframework.web.servlet.ModelAndView;
15 
16 import com.yijia.api.util.SimpleDateFormatCache;
17 
18 /**
19  * 記錄信息:</br> 訪問時間</br>Controller路徑</br>對應方法名</br>請求參數信息</br>請求相對路徑</br>請求處理時長
20  * 
21  * @author Administrator
22  * 
23  */
24 public class TimeCostInterceptor implements HandlerInterceptor {
25 
26     // before the actual handler will be executed
27     public boolean preHandle(HttpServletRequest request,
28             HttpServletResponse response, Object handler) throws Exception {
29         long startTime = System.currentTimeMillis();
30         request.setAttribute("startTime", startTime);
31         if (handler instanceof HandlerMethod) {
32             StringBuilder sb = new StringBuilder(1000);
33 
34             sb.append("-----------------------").append(SimpleDateFormatCache.getYmdhms().format(new Date()))
35                     .append("-------------------------------------\n");
36             HandlerMethod h = (HandlerMethod) handler;
37             sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n");
38             sb.append("Method    : ").append(h.getMethod().getName()).append("\n");
39             sb.append("Params    : ").append(getParamString(request.getParameterMap())).append("\n");
40             sb.append("URI       : ").append(request.getRequestURI()).append("\n");
41             System.out.println(sb.toString());
42         }
43         return true;
44     }
45 
46     // after the handler is executed
47     public void postHandle(HttpServletRequest request,
48             HttpServletResponse response, Object handler,
49             ModelAndView modelAndView) throws Exception {
50         long startTime = (Long) request.getAttribute("startTime");
51         long endTime = System.currentTimeMillis();
52         long executeTime = endTime - startTime;
53         if(handler instanceof HandlerMethod){
54             StringBuilder sb = new StringBuilder(1000);
55             sb.append("CostTime  : ").append(executeTime).append("ms").append("\n");
56             sb.append("-------------------------------------------------------------------------------");
57             System.out.println(sb.toString());
58         }
59     }
60 
61     private String getParamString(Map<String, String[]> map) {
62         StringBuilder sb = new StringBuilder();
63         for(Entry<String,String[]> e:map.entrySet()){
64             sb.append(e.getKey()).append("=");
65             String[] value = e.getValue();
66             if(value != null && value.length == 1){
67                 sb.append(value[0]).append("\t");
68             }else{
69                 sb.append(Arrays.toString(value)).append("\t");
70             }
71         }
72         return sb.toString();
73     }
74 
75     public void afterCompletion(HttpServletRequest arg0,
76             HttpServletResponse arg1, Object arg2, Exception arg3)
77             throws Exception {
78 
79     }
80 }

由於Interceptor是Spring MVC的功能組件,所以需要把此攔截器配置在springmvc的xml配置文件中(或者使用其他配置方式比如javaConfig):

 <mvc:interceptors>
        <!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>            
            <!-- 需排除攔截的地址 -->  
            <mvc:exclude-mapping path="/" />
            <mvc:exclude-mapping path="/test" />
            <!-- 定義在mvc:interceptor下面的表示是對特定的請求才進行攔截的 -->
            <bean class="com.api.web.interceptor.TimeCostInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

定義並配置好好攔截器後,在程序Controller中的接口被訪問的時候,相關訪問信息就會輸出到控制台上,也可以使用日志將訪問信息記錄到日志中。

記錄效果如下所示:

 

總結:

攔截器通對用戶請求進行攔截可以對用戶的請求(HttpServletRequest)進行預處理,也可以對返回給用戶的響應(HttpServletResponse)進行訪問後處理,還可以在請求完成後針對請求的異常信息進行處理。能夠在request對象和response對象中進行操作的問題都可以通過攔截器進行統一處理,常用的場景包括用戶登錄控制、權限檢查,跨域請求訪問權限控制等。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved