2015-06-15 2 views
1

Я работаю с Java 8 и Spring 1.2.3 построить приложение, работающее внутри Tomcat 7 контейнера.Как применить HandlerInterceptor к конечным точкам исполнительного элемента Spring Boot?

Я перехватываю каждый звонок в своем веб-приложении, используя очень простой HandlerInterceptor, который регистрирует общее время, необходимое для создания ответа и кода возврата для каждого запроса.

Я активировал привода конечных точек, просто добавив 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()); 
    } 

} 

По-видимому, все конечные точки, управляемые Спринг загрузки привода (/info, /health и так далее) не получают intercepted: Как я могу убедиться, что перехватчик перехватывает все вызовы, сделанные в моем приложении, в том числе вызывающие конечную точку, обеспечивающую привод?

+0

Вы используете tomcat или пристань? – stalet

+0

Tomcat 7 - добавлен в вопрос – micpalmia

ответ

2

Вы можете использовать EndpointHandlerMappingCustomizer для настройки перехватчики оконечных привода. Например:

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

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

    }; 
} 
1

В tomcat вы также можете добавить клапан для перехвата вызовов на веб-сервер. Клапан будет перехватывать все точки доступа независимо от их стека перехватчиков.

Вот пример того, как реализовать клапан весной загрузки:

@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; 
    } 

} 
+0

Я пробовал ваш метод, и клапан работает только внутри встроенного кота. Если я создаю файл .war и разворачиваю его на экземпляр tomcat, клапан не будет вызываться. Вы знаете, как это решить? Благодарю. – snowery

+0

Возможно, вам придется вручную настроить его в файле context.xml. Подробнее см. Документацию https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html. – stalet

Смежные вопросы