针对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;
}

猜你喜欢

转载自www.cnblogs.com/beyond-MS/p/10797490.html