这可能很难解释为什么,但我遇到了这种情况,我需要获取当前请求的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字符串吗?
如果这是可能的,我如何才能做到这一点?
发布于 2018-07-16 06:58:21
您可以实现一个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
你可以添加更多的逻辑来内省某些方法,某些类型的请求等等。
发布于 2018-07-16 05:41:32
我认为你可以通过反射和@RequestMapping anotations来获得它。例如,当您使用@RequestMapping(value = "/Test/x/{number}",method = RequestMethod.GET)
这个值就是你想要的,如果我没弄错的话!
您只需找到控制器类类型。我认为这是可能的,但我没有测试它。
请检查以下内容:
In a Spring-mvc interceptor, how can I access to the handler controller method?
首先,如果HandlerMethod是正确的,它可能会得到解决,但是如果你得到了强制转换错误,那么你必须得到控制器类,我认为。当您获得控制器类时,您可以使用@RequestMapping注释查找方法。
所以
1-查找控制器类类型
2-通过反射搜索类中的所有方法
3-使用指定的url和指定的方法GET / POST检查方法注释
4-选择最佳候选人
如果你有两个以上的URL参数,这个方法就不好了!
https://stackoverflow.com/questions/51352320
复制相似问题