Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从HTTP筛选器访问URL处理程序模式_Http_Spring Mvc_Servlets - Fatal编程技术网

从HTTP筛选器访问URL处理程序模式

从HTTP筛选器访问URL处理程序模式,http,spring-mvc,servlets,Http,Spring Mvc,Servlets,我想创建一个过滤器,它将记录特定web请求所花费的时间以及操作名称。然而,有些URL有路径参数,我正在寻找一些可以让我获得与特定方法相对应的URL模式的东西,而不是URL本身 例如,对于处理URL的GET请求的方法,如/users/{id}/accounts/{type},我希望看到操作名,如GET/users/{}/accounts/{},而不是说:GET/users/1/accounts/facebook或GET/users/2/accounts/twitter?someParam=3 现在

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

例如,对于处理URL的GET请求的方法,如
/users/{id}/accounts/{type}
,我希望看到操作名,如
GET/users/{}/accounts/{}
,而不是说:
GET/users/1/accounts/facebook
GET/users/2/accounts/twitter?someParam=3

现在我通过将URL与解析日志记录的工具中的预定义模式相匹配来解决这个问题,但对我来说,这看起来像是一个黑客行为

我没有找到一种简单的方法来访问与处理传入请求的方法相关联的URL模式,所以我现在正在考虑的一种可能的解决方案是在控制器方法本身中设置一个线程局部变量,并在我的HTTP过滤器中访问它,但这似乎不是一种干净的方法来解决这个问题

这个问题有没有更好的解决办法


设置一些上下文:我正在使用SpringMVC4。

好的,结果非常简单。使用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注释,那么它的值将在模式前面。

如果您有过滤器扩展GenericFilterBean,它可以被Spring管理。然后,您可以注入已配置RequestMappingHandlerMapping的实例,这似乎是查找给定请求的映射所需的。我还没有弄清楚如何从这里开始,但看看这可能会给你一些想法,你将如何获得匹配的url模式。好的,看起来我看到了如何使它工作。如果我决定在工作代码中坚持这种方法,我会更新我的问题,除非我决定坚持其他方法。@AlanHay我发布了一个答案,结果比我希望的简单得多。