Spring mvc - 如何在拦截器中获取映射信息

时间:2014-10-31 02:23:43

标签: java spring-mvc web interceptor

Spring mvc - 如何在拦截器中获取映射信息?

ex - 当用户请求 / user / 12345 网址时,我想在拦截器中获取 / user / {id} 字符串。 我该怎么办?

@Override
public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response, Object handler) throws Exception {

    String mappingUri = someMethod(); // get "/post/{id}"; but not /post/12345

    return true;
}

2 个答案:

答案 0 :(得分:0)

我真的不建议这样做。只应为控制器处理程序方法知道path元素的标识符名称。你的拦截器没有业务知道它。更重要的是,如果此逻辑仅适用于该映射,您可以将其置于处理程序方法中并使用@PathVariable

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    Map<String, String> uriTemplateVars = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
    return true;
}

您现在可以使用任何键,例如"id"来检索uriTemplateVars中的路径元素。

答案 1 :(得分:0)

以下代码返回[“/ user / {id}”]

public static List<String> getMappingInfo(HandlerMethod method) {
        String prefixs[] = method.getBean().getClass().getAnnotation(RequestMapping.class).value();
        if (ArrayUtils.isEmpty(prefixs))
            prefixs = new String[] { "" };

        String mappings[] = method.getMethod().getAnnotation(RequestMapping.class).value();

        List<String> info = new ArrayList<>();
        for (String prefix : prefixs) {
            for (String mapping : mappings) {
                info.add(prefix + "/" + mapping);
            }
        }

        return info;
    }