針對Restful風格參數傳遞的請求獲取真實url

昨天遇到這樣一個問題,先簡單介紹下.redis

業務場景

咱們想要統計熱點請求URL,進而進行分析優化restful

方案

經過過濾器獲取到請求url(調用方法request.getservletpath),經過redis進行記錄,最後作統計分析優化

問題

因爲存在部分restful風格的url(經過url進行參數傳遞),這就致使不一樣的參數獲取到的url不一樣的問題,顯然這不是咱們想要的編碼

思路

由於控制層解析restful風格的傳參,用到了註解@PathVariable,因此考慮經過獲取請求方法上的@PathVariable註解的數量,進而獲取到參數的數量(兩者相等,固然這要求規範編碼~),而後截取url獲得真正須要的urlurl

解決方案:

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;
}
相關文章
相關標籤/搜索