我正在使用 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
等)管理的所有端点都没有被拦截:我怎样才能确保拦截器拦截所有调用我的应用程序,包括调用执行器提供的端点的那些?
答案 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;
}
}