Spring MVC从拦截器获取映射控制器方法
问题内容:
现在我有一个像这样的控制器
@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这样的类吗?
提前致谢 :)
编辑:
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>
拦截器-server.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.test.web.interceptors.SecurityInterceptor" init-method="init">
...
</bean>
</mvc:interceptor>
问题答案:
可以通过框架应作为处理程序对象传递的HandlerMethod对象,在拦截器中检查控制器方法上的注释。
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod) handler;
if (method.getMethod().isAnnotationPresent(Security.class)) {
//do processing
}
}
但是,根据HandlerMethod javadoc中的spring文档,在Spring
3.1中引入了HandlerMethod类。在3.1之前的版本中,处理程序对象似乎是Controller实例,这使得获取调用的controller方法的注释变得困难。
您可以升级到3.1。然后从HandlerMethod对象中获取注释,或尝试解析控制器方法上的所有RequestMapping注释,然后尝试通过将RequestMappings与请求URI进行比较来确定调用了哪个方法。
如果不能选择升级,则另一种选择是使用AOP代替mvc拦截器。