2
    <context:component-scan base-package="com.stack" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <context:annotation-config/>

    <mvc:annotation-driven/>
    <mvc:interceptors>
      <mvc:interceptor>
        <mvc:mapping path="/secure/**"/>
        <bean class="com.stack.interceptors.SecurityInterceptor"></bean>
      </mvc:interceptor>
    </mvc:interceptors>

控制器看起来像这样

@Controller
@RequestMapping("secure")
public class SecureController {

    @RequestMapping(value = "/good", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Boolean getSecure() {
        return true;
    }

拦截器看起来像这样,永远不会被调用:

public class SecurityInterceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
        System.out.println("Intercepted");
        String token = request.getHeader("TOKEN");
        if(token.equals("TEST")){
            return true;
        }
        response.sendRedirect("/secure/other/" ); //sends to other controller method
        return false;
    }

到目前为止,仅使用显示的上下文剪断器和 springs 测试模拟进行了测试(对于其他所有东西都可以正常工作,控制器测试在现在之前已经设置并可以正常工作)

@Autowired
protected WebApplicationContext webApplicationContext;

Mock mockMvc = webAppContextSetup(webApplicationContext).build();
4

1 回答 1

3

问题是您没有覆盖该preHandle()方法,而是重载了它。它需要是

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

他们以你的方式拥有它,使用ModelAndView参数,你只是声明一个随机方法,所以HandlerInterceptorAdapter父类的实际preHandle方法被调用并true立即返回。

AHandlerInterceptor不像用 注释的方法@RequestMapping,你不能只声明你想要的任何参数。Spring不使用反射来调用它,它使用HandlerInterceptor接口。

在请求处理的这一点上,您无权访问该ModelAndView对象。

您可以在 中访问它postHandle,但我想此时这并不重要,因为您已经在发送响应。

该问题与您的映射无关。他们很好。

于 2013-09-25T14:12:28.107 回答