猿问

获取已命中的URL模板

我有几个 API 的 spring MVC 控制器,我想获取从前端命中的 API 的 URI


我有一个过滤器扩展 oncePerRequestFilter,它拦截每个 api 调用,过滤器有接受 HttpServletRequest、HttpServletResponse 和 filterChain 的方法。我可以使用 urirequest.getRequestURI()但如果 uri 具有模板路径变量,可以说 uri ="q/v1/ruleset/{rulesetId}" 我正在获取最终的 uri,例如 API 已被命中rulesetid=23,我从中获取的 urirequest.getRequestURI()是 "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();


      }


    }


噜噜哒
浏览 162回答 5
5回答

犯罪嫌疑人X

您将无法在过滤器中执行此操作,因为过滤器是在处理程序之前执行的。您可以实现一个 HandlerInterceptor 并获得如下所示的路径映射public class LogInterceptor implements HandlerInterceptor {     @Override      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {          String path = (String)request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);          System.out.println("path : " + path);        return true;      }}

慕婉清6462132

做这个    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)            throws ServletException, IOException {        try {            filterChain.doFilter(request, response);        } finally {            String patternMatch = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);        }    }在尝试调用 request.getAttribute 之前,您需要先执行 filterChain.doFilter,因为该属性直到请求生命周期的后期才会设置。

守着一只汪

你可以试试这个:String path = (String)request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);

手掌心

我怀疑您能否通过现有 API 将其放入过滤器中。但是,您可以预扫描所有 @RequestMapping 注释,保留它,然后在过滤器中匹配模式以获得所需的结果。

holdtom

Spring Boot Admin - 易于使用 GUI另一种方法是使用Spring Boot Admin。为此,我们必须配置客户端-服务器。为避免错误,请确保客户端-服务器依赖项的版本相同。我们可以从下拉列表中添加所需的指标,如图所示。您可以将 uri:/user/getEmployee/{employeeId} 的 TOTAL_TIME 计数为 3, 0.2264027客户端:pom.xml<dependency>     <groupId>de.codecentric</groupId>     <artifactId>spring-boot-admin-starter-client</artifactId>     <version>2.1.4</version></dependency>application.propertiesspring.boot.admin.api-path=/instancesspring.boot.admin.client.url=http://localhost:6699management.endpoints.web.exposure.include=*服务器端:application.propertiesserver.port = 6699spring.boot.admin.server.url=http://localhost:8889pom.xml <dependency>         <groupId>de.codecentric</groupId>         <artifactId>spring-boot-admin-starter-server</artifactId>         <version>2.1.4</version>    </dependency>添加@EnableAdminServerimport de.codecentric.boot.admin.server.config.EnableAdminServer;@SpringBootApplication@EnableAdminServerpublic class AdminApplication {    public static void main(String[] args) {        SpringApplication.run(AdminApplication.class, args);    }}界面 http://localhost:6699/#/applications程序化方法如果你想实现这个如果你想以编程方式实现这个。@RequestMapping(path="/admin/count",method=RequestMethod.POST)public JSONObject count(@RequestParam(name="url") final String url)//@PathVariable(name="url") final String url{       String finalURL = "http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:" + url + "";    return sendRequestToURL(finalURL);  }我们可以使用 Spring Boot/actuator/metrics/http.server.requests获取所有执行的端点及其计数、异常、结果、状态、总时间等,如下所示。如果您想查看特定端点的详细信息,则可以通过调用请求来完成,如下所示localhost:8889/actuator/metrics/http.server.requests?tag=uri:<endPoint>localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/asset/getAllAssetslocalhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/asset/getAllAssets&tag=status:200您将获得COUNT特定端点被调用的次数您将获得具有特定状态的特定端点被 调用的COUNT次数要获得执行 endPoint 的平均时间,您可以 TOTAL_TIME/COUNT为特定的 endPoint 以及整个应用程序执行更详细的解释本地主机:8889/actuator/metrics/http.server.requests{    "name": "http.server.requests",    "description": null,    "baseUnit": "seconds",    "measurements": [        {            "statistic": "COUNT",            "value": 3        },        {            "statistic": "TOTAL_TIME",            "value": 0.21817219999999998        },        {            "statistic": "MAX",            "value": 0.1379249        }    ],    "availableTags": [        {            "tag": "exception",            "values": [                "MethodArgumentTypeMismatchException",                "None"            ]        },        {            "tag": "method",            "values": [                "GET"            ]        },        {            "tag": "uri",            "values": [                "/{id}.*",                "/user/asset/getAsset/{assetId}",                "/user/asset/getAllAssets"            ]        },        {            "tag": "outcome",            "values": [                "CLIENT_ERROR",                "SUCCESS"            ]        },        {            "tag": "status",            "values": [                "400",                "404",                "200"            ]        }    ]}
随时随地看视频慕课网APP

相关分类

Java
我要回答