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


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

業務場景

我們想要統計熱點請求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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM