Spring拦截器无效

5

我知道这个问题已经被问了很多次,但是没有一个能让我的代码工作。我可能做错了什么,但是我找不出来。

我正在使用Spring Boot和AngularJS,我想要做的是预处理所有请求。

这是我的代码:

控制器:

@RestController
@RequestMapping(value = { "/user" })
public class UserController {

    @RequestMapping(value = "/get", method = RequestMethod.GET)
    public String getLanguage() {
        return "user";
    }
}

拦截器:

@Component
public class RequestHandler extends HandlerInterceptorAdapter {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
      System.out.println("intercepted");
      return false;
  }
}

WebConfig:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Autowired
  HandlerInterceptor requestHandler;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(requestHandler);
  }
}

我在applicationContext.xml中添加了以下内容:

<mvc:interceptors>
    <bean class="server.RequestHandler" />
</mvc:interceptors>

我整个周末都在尝试让这个工作起来,但我无法做到。任何帮助将不胜感激!谢谢!

你尝试过注入RequestHandler而不是通用的HandlerInterceptor吗?或者使用registry.addInterceptor(new RequestHandler())来注册你的拦截器? - Nathanael
我已经尝试过了,但它仍然不起作用。 - Motomine
为什么在设置Spring MVC时既有XML配置,又有Java配置...这很容易出问题...而且如果没有@EnableWebMvc<mvc:annotation-driven />中的任何一个,这些配置将毫无用处。同样的情况也适用于手动配置HandlerAdapter和/或HandlerMapping - M. Deinum
我该怎么做呢?你能给我一个例子,告诉我需要做哪些更改才能尝试它是否有效吗? - Motomine
1个回答

2
您可以尝试手动定义Bean,而无需将您的拦截器声明为@Component,如下所示:

RequestHandler.java

public class RequestHandler extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws ServletException {
        System.out.println("intercepted");
        return true;
    }
}

WebConfig.java

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public RequestHandler requestHandler() {
        return new RequestHandler();
    }

    @Override
    public void addInterceptors(final InterceptorRegistry registry) {
        registry.addInterceptor(requestHandler());
    } 
}

顺便说一句:如果该类被声明为拦截器,为什么不将其重命名为包含术语“Interceptor”的名称,例如RequestInterceptor
应该很简单。请告诉我是否对您有用!
更新:我在原型中实施了这个功能。请参见此最小,完整和可验证的示例。希望能帮到您!https://github.com/dbubenheim/stackoverflow-41794738.git

我尝试过了,但是它说它可以在那里创建一个bean。我不知道还能做什么,因为我已经尝试了很多方法。我需要在web.xml中设置一些东西吗?因为我的是空的,我尝试在那里设置servlet映射,但它说它不能被声明或类似的东西。 - Motomine
还有一点我必须提到的是,preHandle方法的返回值应该为true,以便完成请求处理链并到达您的控制器方法。请也参考一下@Motomine。 - Daniel Bubenheim
我想要的并不是返回它,只是测试它是否有效,但页面总是在加载。 - Motomine
我觉得你对这个有误解了。你看过我的例子了吗?你的代码应该是一样的。拦截器在每个请求期间被调用。 - Daniel Bubenheim
这篇文章对我很有帮助,当我尝试实现 https://dzone.com/articles/correlation-id-for-logging-in-microservices 时,我将我的拦截器声明为 @Component,并使用 @Autowired 自动装配拦截器 bean,然后添加到了 registry.addInterceptor 中。 - Buddhi
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接