昨天遇到這樣一個問題,先簡單介紹下.
業務場景
我們想要統計熱點請求URL,進而進行分析優化
方案
通過過濾器獲取到請求url(調用方法request.getservletpath),通過redis進行記錄,最后做統計分析
問題
由於存在部分restful風格的url(通過url進行參數傳遞),這就導致不同的參數獲取到的url不同的問題,顯然這不是我們想要的
思路
因為控制層解析restful風格的傳參,用到了注解@PathVariable,所以考慮通過獲取請求方法上的@PathVariable注解的數量,進而獲取到參數的數量(二者相等,當然這要求規范編碼~),然后截取url得到真正需要的url
解決方案:
private String getRealUrl(Object handler,String url){
Annotation[][] parameterAnnotations = ((HandlerMethod) handler).getMethod().getParameterAnnotations();
int i = 0;
for (Annotation[] annotations : parameterAnnotations) {
for (Annotation annotation : annotations) {
if(annotation instanceof PathVariable){
i++;
break;
}
}
}
if (i == 0){
return url;
}
List<String> split = Arrays.asList(url.split("\\/"));
List<String> subList = split.subList(0, split.size() - i);
String join = Joiner.on("/").join(subList);
return join;
}