从拦截器获取Spring MVC的GetMapping控制器方法

4

现在我有一个这样的控制器

@RequestMapping("/content/delete.json")
@Security(auth = AuthType.REQUIRED)
public ModelAndView deleteIndex(User user, @RequestParam("id") long id) {

}

现在我正在尝试从拦截器中获取控制器映射方法,并获取该方法的注释。

Method method = RestRequestURLUtil.getInvokedMethod(handler, request);
Security security = method.getAnnotation(Security.class);
if(security.getAuth() == AuthType.REQUIRED) {
    do some validate here
}

有类似于RestRequestURLUtil的类在Spring中吗?
提前致谢 :)
编辑:
web.xml
<servlet>
    <servlet-name>rest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/rest-servlet.xml,
                /WEB-INF/interceptor-servlet.xml
            </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>rest</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

interceptor-server.xml

<mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/**" />
    <bean class="com.test.web.interceptors.SecurityInterceptor" init-method="init">
     ...
    </bean>
</mvc:interceptor>

类测试 = 处理程序.getClass(); 调试结果是search.controllers.SearchJobController @KresimirNesek - Felix
有趣...你能发布注册拦截器的代码/配置吗? - Krešimir Nesek
也许这是一个愚蠢的问题,但你是否在测试正确的URL?使用@RequestMapping似乎不可能将控制器作为“handler”参数。对我来说,这听起来像是SimpleUrlHandlerMapping找到了处理程序。 - Bart
嗯,SearchJobController 是您期望的控制器吗?看着您的处理方法,似乎不太合逻辑。也许是其他映射优先级更高? - Bart
Spring的版本是3.0.5.RELEASE。这是问题所在吗?@KresimirNesek - Felix
显示剩余5条评论
1个回答

7
控制器方法上的注解可以通过拦截器检查,拦截器应该将框架传递的HandlerMethod对象作为处理程序对象。
if (handler instanceof HandlerMethod) {
    HandlerMethod method = (HandlerMethod) handler;
    if (method.getMethod().isAnnotationPresent(Security.class)) {
       //do processing
    }
}

然而,根据Spring文档中的HandlerMethod javadoc,HandlerMethod类是在Spring 3.1中引入的。似乎在3.1之前的版本中,处理程序对象是控制器实例,这使得获取调用的控制器方法的注释变得困难。
您可以升级到3.1,并从HandlerMethod对象中获取注释,或尝试解析控制器方法上的所有RequestMapping注释,然后通过比较RequestMapping和请求URI来确定调用的方法。
如果升级不是一个选项,另一个选择是使用AOP而不是mvc拦截器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接