我想创建一个过滤器,用于记录特定Web请求所花费的时间以及操作名称。但是,有些URL有路径参数,我正在寻找能够获得与特定方法而不是URL本身相对应的URL模式的东西。
例如,对于处理/users/{id}/accounts/{type}
等网址的GET请求的方法,我希望看到GET /users/{}/accounts/{}
之类的操作名称,而不是:GET /users/1/accounts/facebook
或GET /users/2/accounts/twitter?someParam=3
。< / p>
现在我通过在解析日志记录的工具中将URL与预定义模式匹配来解决这个问题,但对我而言,它看起来像是黑客。
我没有找到一种简单的方法来访问与处理传入请求的方法相关联的URL模式,因此我正在考虑的一种可能的解决方案是在控制器方法本身中设置线程局部变量并在其中访问它我的HTTP过滤器,但这似乎也不是一个解决这个问题的简洁方法。
这个问题有更好的解决方案吗?
设置一些上下文:我正在使用Spring MVC 4.
答案 0 :(得分:2)
好的,事实证明它非常简单。使用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}这样的网址模式,你会看到那个模式!
好的是这个变量包含复合模式,所以如果你的控制器用RequestMapping注释,它的值将被添加到模式之前。