如何配置spring拦截器来调用每个请求

时间:2017-05-24 11:26:59

标签: java node.js docker spring-boot docker-compose

我想以这样一种方式配置我的spring拦截器,即每次请求都应该调用它。

  • 我在API-GATEWAY中使用拦截器(Spring-Boot)
  • 从API-GATEWAY我打电话给其他微服务。
  • 来自API-GATEWAY的其他微服务的调用工作正常。
  • 我打电话的其他服务是Node.js服务,另一方面,我的API网关是春季启动。
  • 所有服务(Node.js + Spring-Boot)都在 Docker容器上运行。

我在Interceptor中遇到了一个问题。我想以这样的方式配置它:每次请求时都应该调用preHandle()并执行我在其中编写的操作。

我注意到了一个我想在此提及的问题。

如果我正在调用的服务已停止(未运行),Interceptor正在正常工作并给我一些响应,例如somename-service not found。 如果此时正在运行相同的服务,则不会执行Interceptor。

这是我的代码段

@EnableEurekaClient
@SpringBootApplication
@EnableZuulProxy
@Configuration
public class Application extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Autowired
    private TokenValidateInterceptor tokenValidateInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(tokenValidateInterceptor).addPathPatterns("/**");


    }

拦截器

@Component
public class TokenValidateInterceptor extends HandlerInterceptorAdapter {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        LOG.info("#### Starting TokenValidateInterceptor.preHandle ####");

        String apiKey = null;
        try {
            apiKey = request.getHeader("apikey");

            LOG.info("The request come with apikey ======" + apiKey);

            LOG.info("Actual apikey ======" + azureApikey);


}

3 个答案:

答案 0 :(得分:0)

您必须将此拦截器添加到调度程序xml文件中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" p:interceptors-ref="tokenInterceptor" />

    <bean id="tokenInterceptor" class="yourpackage.TokenValidateInterceptor" />

</beans>

这里有很多不错的样品:

答案 1 :(得分:0)

首先制作一个如下所示的WebMvc Config类

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }

通过扩展HandlerInterceptorAdapter创建请求拦截器,即MyInterceptor

public class MyInterceptor extends HandlerInterceptorAdapter{
    @Override
    public void postHandle(HttpServletRequest request, 
    HttpServletResponse response, 
    Object handler, 
    ModelAndView modelAndView) throws Exception {
        ......Write your business logic here...........}
}

有关更多信息,您可以参考here

答案 2 :(得分:0)

在这种情况下,我认为您应该使用HttpFilter,它具有doFilter方法,只需重写该方法并执行您的代码即可。