如何知道处理程序spring控制器类和指定的HttpServletRequest对象的处理程序方法

时间:2016-12-01 10:42:19

标签: spring spring-mvc

我需要以某种方式使用Web过滤器中的反射访问处理程序方法,并获取requestPattern值,而不将控件传递给调度程序servlet。我怎样才能做到这一点? 我只有那个HttpServletRequest对象,不知怎的,我也可以@Autowire那里有ApplicationContext个对象。

感谢。

2 个答案:

答案 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将再次进行查找。