Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringMVC从拦截器获取映射控制器方法_Spring_Spring Mvc - Fatal编程技术网

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

SpringMVC从拦截器获取映射控制器方法,spring,spring-mvc,Spring,Spring Mvc,现在我有一个这样的控制器 @RequestMapping("/content/delete.json") @Security(auth = AuthType.REQUIRED) public ModelAndView deleteIndex(User user, @RequestParam("id") long id) { } 现在我试图从拦截器中获取控制器映射方法,并获取该方法的注释 Method method = RestRequestURLUtil.getInvokedMethod(h

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

@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>

休息
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
/WEB-INF/rest-servlet.xml,
/WEB-INF/interceptor-servlet.xml
1.
休息
/
interceptor-server.xml

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

...

可以通过框架应作为handler对象传递的HandlerMethod对象在拦截器中检查控制器方法上的注释

if (handler instanceof HandlerMethod) {
    HandlerMethod method = (HandlerMethod) handler;
    if (method.getMethod().isAnnotationPresent(Security.class)) {
       //do processing
    }
}
然而,根据中的spring文档,HandlerMethod类是在Spring3.1中引入的。在3.1之前的版本中,处理程序对象似乎是控制器实例,这使得获取所调用控制器方法的注释变得困难

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


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

我不确定问题出在哪里?如果您想知道如何检查在拦截器中是否使用
@Security
注释了处理程序方法,您可以这样做
If(HandlerMethod的处理程序实例){HandlerMethod=(HandlerMethod)处理程序;If(method.getMethod().isAnnotationPresent(Security.class)){…}
我认为处理程序是控制器类的一个实例。让我调试并检查它。@KresimirNesekClass test=handler.getClass();调试结果是search.controllers.SearchJobController@KresimirNesekInteresting…你能在注册拦截器的地方发布代码/配置吗?可能是个愚蠢的问题,但你正在测试正确的URL吗?似乎不可能使用
@RequestMapping
将控制器作为
处理程序
参数。听起来像是这样就像一个
simplerlhandermapping
计算出了处理程序。