我有以下拦截器类:
package cz.coffeeexperts.feedback.server.web.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class RestAuthorizationInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
System.out.println("fuu");
response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
return false;
}
}
我在spring-webmvc.xml中配置它如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<mvc:annotation-driven/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/rest/api/01/status" />
<bean class="cz.coffeeexperts.feedback.server.web.interceptors.RestAuthorizationInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
</beans>
然而,当我转到http://localhost:8080/myserver/rest/api/01/status
时,我会得到状态代码为200的常规答案(与我添加拦截器之前相同)。另外,消息&#34; fuu&#34;未打印(因此不调用preHandle方法)。
有什么想法吗?我开始使用这个示例:http://javapapers.com/spring/spring-mvc-handler-interceptor/,但所有其他示例看起来都一样,我无法找到出错的地方。
我正在使用Spring 3.2.4.RELEASE
重要的编辑,它适用于:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="cz.coffeeexperts.feedback.server.web.interceptors.RestAuthorizationInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
所以问题是,我的道路有什么问题?
答案 0 :(得分:4)
好的,我找到了解决方案,因为我的路径定义如下:
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
这就是我的控制器的样子
@Controller
@RequestMapping(value = "/api")
public class ApiController {
@RequestMapping(value = "/01/status", method = RequestMethod.GET)
@ResponseBody
public ServerStatusJSON getStatus(HttpServletResponse response) {
...
}
}
此地址的工作配置:http://localhost:8080/myserver/rest/api/01/status
如下:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/01/status" />
<bean class="cz.coffeeexperts.feedback.server.web.interceptors.RestAuthorizationInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
PS:我感谢geoand,他把我推向正确的方向。
答案 1 :(得分:1)
我通过更改mvc:mapping
的值解决了这个问题。我的工作配置是:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.mmd.micro.common.TokenInterceptor">
<property name="excludeUrls">
<list>
<value>/app/token</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
答案 2 :(得分:1)
提供有关此方法为libik工作的原因的其他说明。他提到他的控制器看起来像 -
@Controller
@RequestMapping(value = "/api")
public class ApiController {
@RequestMapping(value = "/01/status", method = RequestMethod.GET)
@ResponseBody
public ServerStatusJSON getStatus(HttpServletResponse response) {
...
}
}
还要记住拦截器处于HandlerMapping
级别。在这种情况下,它将是RequestMappingHandlerMapping
(Spring 3.1+ with mvc:annotation-driven
)或DefaultAnnotationHandlerMapping
。这里的映射将是
/api/01/status
这正是他所做的。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/01/status" />
<bean class="cz.coffeeexperts.feedback.server.web.interceptors.RestAuthorizationInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
如果您希望将它应用于所有模式,您只需执行<mvc:mapping path="/**"/>
- 这将匹配所有URL(包括子路径),或者您只需为所有HandlerMappings调用拦截器 -
<mvc:interceptors>
<bean class="cz.coffeeexperts.feedback.server.web.interceptors.RestAuthorizationInterceptor" />
</mvc:interceptors>