1

我目前正在使用 Spring Cloud Sleuth 开发一个监控应用程序。目前,我尝试尽可能多地收集有关我的请求的信息。

为了使该方法尽可能具有可扩展性,我使用GenericFilterBeansHandlerInterceptorAdapter访问来自发送到 REST-API 的请求的信息。

我正在努力获取 REST 调用的参数,其中参数是从 URL 映射的,如下面的代码片段所示:

  @RequestMapping(
            value = {"/{service}/{route_id}/book", "/accounting-core-service/{service}/{route_id}/book"},
            method = RequestMethod.GET)
    @ResponseBody
    public ModelAndView book(@PathVariable(value="service") String serviceName,
                             @PathVariable(value = "route_id") int routeId,
                             HttpServletResponse response) {
    /*Do something*/
}

问题不在于这样写是否是好习惯。问题是是否有类似于 Filter 或 Interceptor 的方法(或正确使用它们)来访问这些参数。

一个要求是,它可以通过添加非常少的代码行轻松地应用于应用程序。手动注释每个方法调用或手动插入代码以从方法内将参数写入跟踪对我来说是不可行的。

如果您需要更多信息,请随时询问。我将为您提供帮助我解决问题所需的所有信息。

4

2 回答 2

1

尽管没有官方支持(因为它没有写在参考文档中),但 Spring MVC 将该信息保存为请求属性。

您可以创建自己的HandlerInterceptor,在侦探之后立即订购,并从请求中获取该信息,如下所示:

// "/{service}/{route_id}/book"
String matchingPattern = (String) request
                    .getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
// "service" => "fooService", "route_id" => "42"
Map<String, String> templateVariables = (Map<String, String>) request
                    .getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

请注意,模板变量此时已经解码,这可能是您想要的。

于 2017-07-06T13:08:02.367 回答
0

您可以创建一个过滤器来拦截所有请求。

对于每个请求,您还可以检索以下信息:

  • 查询参数
  • 请求正文
  • 网址
  • 头参数

您可以根据需要保存所有这些数据。这是您可以做到这一点的最佳方式。


如果您需要将所有 url 像/{service}/{route_id}/book一个“家庭”的 url 分组,您可以拆分 url 并检查它是否是家庭的一部分,但是当您的代码中添加一个新家庭时,您需要更新过滤器(或在外部文件或数据库中配置某些东西)。

于 2017-07-06T10:19:57.200 回答