【发布时间】:2017-03-21 07:27:17
【问题描述】:
我想创建一个过滤器,用于记录特定 Web 请求所花费的时间以及操作名称。但是,某些 URL 具有路径参数,我正在寻找可以让我获得与特定方法而不是 URL 本身相对应的 URL 模式的东西。
例如,对于处理像 /users/{id}/accounts/{type} 这样的 URL 的 GET 请求的方法,我希望看到像 GET /users/{}/accounts/{} 这样的操作名称,而不是说:GET /users/1/accounts/facebook 或 GET /users/2/accounts/twitter?someParam=3。
现在我通过将 URL 与解析日志记录的工具中的预定义模式进行匹配来解决这个问题,但对我来说这看起来像是一个 hack。
我没有找到一种简单的方法来访问与处理传入请求的方法关联的 URL 模式,所以我现在正在考虑的一个可能的解决方案是在控制器方法本身中设置一个线程局部变量并在我的 HTTP 过滤器,但这似乎也不是解决这个问题的干净方法。
有没有更好的办法解决这个问题?
设置一些上下文:我使用的是 Spring MVC 4。
【问题讨论】:
-
如果您的过滤器扩展了 GenericFilterBean,它可以由 Spring 管理。然后,您可以注入已配置的 RequestMappingHandlerMapping 实例,这似乎是您为给定请求查找映射所需要的。我无法确定如何从这里开始,但请参阅stackoverflow.com/questions/14025872/…,这可能会给您一些关于如何获得匹配 url 模式的想法。
-
好的,看来我知道如何让它工作了。如果我决定在工作代码中坚持这种方法,我会更新我的问题 - 除非我决定坚持其他方法。
-
@AlanHay 我发布了一个答案,结果比我希望的要简单得多。
标签: http spring-mvc servlets