我需要以某种方式使用Web过滤器中的反射访问处理程序方法,并获取requestPattern
值,而不将控件传递给调度程序servlet。我怎样才能做到这一点?
我只有那个HttpServletRequest
对象,不知怎的,我也可以@Autowire
那里有ApplicationContext
个对象。
感谢。
答案 0 :(得分:1)
我已经开始研究DispatcherServlet本身如何决定它将为控件提供哪种处理程序方法,并以这种方式实现。 这是代码:
//Initialization in filter constructor
....
final HandlerMapping handlerMappings = BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, HandlerMapping.class, true, false).get("requestMappingHandlerMapping");
....
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
.....
Method mappingMethod = null;
try {
mappingMethod = ((HandlerMethod)handlerMappings.getHandler(request).getHandler()).getMethod();
RequestMapping requestMapping = mappingMethod.getAnnotation(RequestMapping.class);
final String requestPattern = requestMapping.value();
}
catch(Exception ex){
logger.error("Error getting the mapping bean for the request URL " + request.getRequestURI(), ex);
return;
}
....
}
答案 1 :(得分:0)
在@Arsen的建议之外,我建议这样做:
try {
handlerMappings.getHandler(request);
String requestPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
} catch (Exception ex) {
logger.error("Error getting the mapping bean for the request URL " + request.getRequestURI(), ex);
return;
}
getHandler()
指令用于触发正确控制器的弹簧查找,该控制器还将设置HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE
属性,通常在控制器中可用,但在过滤器中不可用。
请注意,这些解决方案将浪费一些资源,因为在此之后spring将再次进行查找。