昨天遇到这样一个问题,先简单介绍下.
业务场景
我们想要统计热点请求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;
}