【发布时间】:2019-12-06 01:09:59
【问题描述】:
我有多个 API 的 Spring MVC 控制器,我想获取从前端命中的 API 的 URI
我有一个扩展 oncePerRequestFilter 的过滤器,它拦截每个 api 调用,该过滤器具有接受 HttpServletRequest、HttpServletResponse 和 filterChain 的方法。
我可以使用request.getRequestURI() 获取uri,但如果uri 具有模板路径变量,可以说uri ="q/v1/ruleset/{rulesetId}"
我得到了最终的uri,例如rulesetid=23的API已经被命中,我从request.getRequestURI()得到的uri是
"q/v1/ruleset/23" 但我想要的是uri ="q/v1/ruleset/{rulesetId}",
有什么方法可以得到预期的结果吗,我知道,我总是可以通过一些操作得到想要的结果,但是我想让事情变得通用,请帮助
我有包含 API 的控制器
@RequestMapping(value = "/ruleset/{rulesetid}", method =
RequestMethod.GET)
public RuleSet getRuleSet(@PathVariable(value = "rulesetid")
final Long ruleSetId) {
return storeMixin.getRuleSet(ruleSetId);
}
过滤器
@Component
@Order(1)
public class CatalogFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,FilterChain filterChain) throws
IOException, ServletException {
long startTime = System.currentTimeMillis();
filterChain.doFilter(request, response);
long elapsed = System.currentTimeMillis() - startTime;
String name = request.getRequestURI();
String requestType = request.getMethod();
Integer httpCode = response.getStatus();
}
}
【问题讨论】:
-
我怀疑您是否可以通过 API 在过滤器中获取它。您可以预先扫描所有 @RequestMapping 注释,保留它,然后在过滤器中匹配模式。
-
您好 Aditya,您的要求是统计数据/指标还是您想要执行的其他操作
-
@PatelRomil,是的,在过滤器中我正在记录 api 执行时间和 api 计数,然后使用 StatsD 推送统计信息,核心问题是路径变量 {rulesetid} 的每个值,它正在一个新的指标,这是不必要的,这就是我想要模板化 uri 的原因
-
@AdityaKrishnaNamdeo 也许您已经得到了答案,但是对于计数和时间统计,如果您愿意,可以使用 spring boot admin 让我知道
-
@PatelRomil 当我使用弹簧执行器收集指标时,执行器提供默认的 http 指标来测量时间和计数,但在 statsD 的情况下,如果此功能存在,我找不到此功能你是说请告诉我
标签: java spring-boot