在Spring拦截器中获取请求映射对象,以获取实际的URL字符串模式

时间:2018-07-15 21:19:05

标签: java spring spring-mvc spring-boot

可能很难解释为什么,但是在这种情况下,我需要获取当前请求的URL的请求URL映射字符串。

Like if I have a GET URL as "/Test/x/{number}" 
I want to get "/Test/x/{number}" not "/Test/x/1"

我可以在拦截器中获取实际声明的url字符串吗?

如果可能的话,我该如何实现

2 个答案:

答案 0 :(得分:3)

您可以实现HanderInterceptor来拦截,前置或发布,请求和自检正在调用的方法。

public class LoggingMethodInterceptor implements HandlerInterceptor {
    Logger log = LoggerFactory.getLogger(LoggingMethodInterceptor.class);

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

        HandlerMethod method = (HandlerMethod) handler;

        GetMapping mapping = method.getMethodAnnotation(GetMapping.class);

        log.info("URL is {}", Arrays.toString(mapping.value()));

        return true;
    }
}

这将输出URL is [/hello/{placeholder}]

完整示例可在此处找到,https://github.com/Flaw101/spring-method-interceptor

您可以添加更多逻辑以仅对某些方法,某些类型的请求等进行自省。

答案 1 :(得分:0)

我认为您可以通过反射获得@RequestMapping注释。 例如当您使用 @RequestMapping(value =“ / Test / x / {number}”,方法= RequestMethod.GET)

如果我做对了,那么价值就是您要寻找的东西!

您只必须找到控制器类类型。 我想可能有,但我没有测试。

检查:

In a Spring-mvc interceptor, how can I access to the handler controller method?

首先可以解决HandlerMethod是否正确的问题,但是如果出现强制转换错误,则必须获得控制器类[我认为]。 当您获得控制器类时,您可以根据@RequestMapping注释查找方法。

所以

1-查找控制器类类型

2-通过反射搜索类中的所有方法

3-使用指定的网址和指定的方法[GET / POST]检查方法注释

4-选择最佳人选

如果您有两个以上的URL参数,则此方法不好!