为了账号安全,请及时绑定邮箱和手机立即绑定

获取已命中的URL模板

获取已命中的URL模板

噜噜哒 2023-04-26 16:16:17
我有几个 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();      }    }
查看完整描述

5 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您将无法在过滤器中执行此操作,因为过滤器是在处理程序之前执行的。


您可以实现一个 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;

      }

}


查看完整回答
反对 回复 2023-04-26
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

做这个


    @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,因为该属性直到请求生命周期的后期才会设置。


查看完整回答
反对 回复 2023-04-26
?
守着一只汪

TA贡献1872条经验 获得超3个赞

你可以试试这个:

String path = (String)request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);



查看完整回答
反对 回复 2023-04-26
?
手掌心

TA贡献1942条经验 获得超3个赞

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



查看完整回答
反对 回复 2023-04-26
?
holdtom

TA贡献1805条经验 获得超10个赞

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.properties


spring.boot.admin.api-path=/instances

spring.boot.admin.client.url=http://localhost:6699

management.endpoints.web.exposure.include=*

服务器端:

application.properties


server.port = 6699

spring.boot.admin.server.url=http://localhost:8889

pom.xml


 <dependency>

         <groupId>de.codecentric</groupId>

         <artifactId>spring-boot-admin-starter-server</artifactId>

         <version>2.1.4</version>

    </dependency>

添加@EnableAdminServer


import de.codecentric.boot.admin.server.config.EnableAdminServer;


@SpringBootApplication

@EnableAdminServer

public class AdminApplication {


    public static void main(String[] args) {

        SpringApplication.run(AdminApplication.class, args);

    }


}

界面 http://localhost:6699/#/applications

//img1.sycdn.imooc.com/6448de3c0001421e06550157.jpg


程序化方法

如果你想实现这个如果你想以编程方式实现这个。

@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/getAllAssets

localhost: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"

            ]

        }

    ]

}



查看完整回答
反对 回复 2023-04-26
  • 5 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信