spring mvc从拦截器获取映射控制器方法

Fel*_*lix 3 spring spring-mvc

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

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

}
Run Code Online (Sandbox Code Playgroud)

现在我试图从拦截器获取控制器映射方法并获取方法的注释.

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

春天有没有像RestRequestURLUtil这样的课程?

提前致谢 :)

编辑:

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>
Run Code Online (Sandbox Code Playgroud)

拦截器的server.xml

<mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/**" />
    <bean class="com.test.web.interceptors.SecurityInterceptor" init-method="init">
     ...
    </bean>
</mvc:interceptor>
Run Code Online (Sandbox Code Playgroud)

Kre*_*sek 6

可以通过HandlerMethod对象在拦截器中检查控制器方法的注释,该对象应该作为处理程序Object传递.

if (handler instanceof HandlerMethod) {
    HandlerMethod method = (HandlerMethod) handler;
    if (method.getMethod().isAnnotationPresent(Security.class)) {
       //do processing
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,根据HandlerMethod javadoc中的spring文档,HandlerMethod类是在Spring 3.1中引入的.似乎在3.1之前的版本中,处理程序对象是一个Controller实例,这使得获取调用的控制器方法的注释变得困难.

您可以升级到3.1.从HandlerMethod对象获取注释或尝试解析控制器方法上的所有RequestMapping注释,然后尝试通过比较RequestMappings和请求URI来确定调用哪个方法.

如果升级不是一个选项,另一种选择是使用AOP而不是mvc拦截器.