如何将HandlerInterceptor应用于Spring Boot Actuator端点?

时间:2015-06-15 07:16:58

标签: java spring spring-mvc spring-boot

我正在使用 Java 8 Spring 1.2.3 来构建在 Tomcat 7 容器内运行的应用程序。< / p>

我使用非常简单的HandlerInterceptor来拦截对我的Web应用程序的每次调用,它记录了创建响应所花费的总时间以及每个请求的返回代码。

我通过简单地添加spring-boot-starter-actuator依赖项来激活执行器端点,并通过调用

添加拦截器
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private Application application;

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

}

显然,Spring Boot Actuator(/info/health等)管理的所有端点都没有被拦截:我怎样才能确保拦截器拦截所有调用我的应用程序,包括调用执行器提供的端点的那些?

2 个答案:

答案 0 :(得分:3)

在Spring Boot 1.x中,您可以使用EndpointHandlerMappingCustomizer配置执行器端点的拦截器。例如:

@Bean
public EndpointHandlerMappingCustomizer mappingCustomizer() {
    return new EndpointHandlerMappingCustomizer() {

        @Override
        public void customize(EndpointHandlerMapping mapping) {
            mapping.setInterceptors(new Object[] { application.executeTimeInterceptor() });
        }

    };
}

答案 1 :(得分:1)

在tomcat中,您还可以添加一个阀门来拦截对Web服务器的调用。无论拦截器堆栈如何,阀门都会拦截所有的点。

以下是如何在弹簧靴中实施阀门的示例:

@Configuration
public class TomcatConfiguration {

    private static final Logger LOG = LoggerFactory.getLogger(TomcatConfiguration.class);

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        final TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        tomcat.addContextValves(new ValveBase() {
            @Override
            public void invoke(final Request request, final Response response) throws IOException, ServletException {
                final long start = System.currentTimeMillis();
                getNext().invoke(request, response);
                LOG.debug("Used time to invoke " + request.getRequestURI() + " : " + (System.currentTimeMillis() - start));
            }
        });
        return tomcat;
    }

}