【问题标题】:Accessing URL handler pattern from HTTP filter从 HTTP 过滤器访问 URL 处理程序模式
【发布时间】:2017-03-21 07:27:17
【问题描述】:

我想创建一个过滤器,用于记录特定 Web 请求所花费的时间以及操作名称。但是,某些 URL 具有路径参数,我正在寻找可以让我获得与特定方法而不是 URL 本身相对应的 URL 模式的东西。

例如,对于处理像 /users/{id}/accounts/{type} 这样的 URL 的 GET 请求的方法,我希望看到像 GET /users/{}/accounts/{} 这样的操作名称,而不是说:GET /users/1/accounts/facebookGET /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


【解决方案1】:

好的,结果非常简单。使用spring,你可以这样做:

public class HttpOperationLoggerFilter extends OncePerRequestFilter {
  private final Logger log = LoggerFactory.getLogger(getClass());

  @Override
  protected void doFilterInternal(HttpServletRequest request,
                                  HttpServletResponse response,
                                  FilterChain filterChain) throws ServletException, IOException {
      // do filter first
      filterChain.doFilter(request, response);

      // ... then you'll be able to access spring MVC's bestMatchingPattern!
      final Object urlPattern = request
        .getAttribute("org.springframework.web.servlet.HandlerMapping.bestMatchingPattern");
      log.info("urlPattern={}", urlPattern);
  }
}

所以,如果你有 MVC 控制器的方法来处理像“/do/{something}/like/{that}”这样的 URL 模式,你就会看到那个模式!

好在这个变量包含复合模式,所以如果你的控制器使用 RequestMapping 注释,它的值将被添加到模式中。

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 2011-08-09
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2010-10-07
    相关资源
    最近更新 更多