spring boot добавление перехватчиков http-запросов


Что такое правильный способ, чтобы добавить класса HttpRequest перехватчики весной загрузки приложения? То, что я хочу сделать, это регистрировать запросы и ответы для каждого http-запроса.

документация Spring boot вообще не охватывает эту тему. (http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)

Я нашел несколько веб-примеров о том, как сделать то же самое с более старыми версиями spring, но те работают с applicationcontext.XML. Пожалуйста помочь.

5 61

5 ответов:

поскольку вы используете Spring Boot, я предполагаю, что вы предпочитаете полагаться на автоматическую конфигурацию Spring, где это возможно. Чтобы добавить дополнительную пользовательскую конфигурацию, такую как ваши перехватчики, просто укажите конфигурацию или компонент WebMvcConfigurerAdapter.

вот пример класса конфигурации:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

  @Autowired 
  HandlerInterceptor yourInjectedInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(...)
    ...
    registry.addInterceptor(getYourInterceptor()); 
    registry.addInterceptor(yourInjectedInterceptor);
    // next two should be avoid -- tightly coupled and not very testable
    registry.addInterceptor(new YourInterceptor());
    registry.addInterceptor(new HandlerInterceptor() {
        ...
    });
  }
}

Примечание не комментируйте это с помощью @EnableWebMvc, если вы хотите сохранить Spring Boots auto configuration for mvc.

WebMvcConfigurerAdapter будет устаревшим с весны 5. От его документация:

@deprecated от 5.0 {@link WebMvcConfigurer} имеет методы по умолчанию (сделано возможно с помощью базовой линии Java 8) и может быть реализован непосредственно без необходимости использования этого адаптера

как указано выше, что вы должны сделать, это реализация WebMvcConfigurer и переопределить addInterceptors метод.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

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

чтобы добавить перехватчик в приложение spring boot, выполните следующие действия

  1. создать класс перехватчика

    public class MyCustomInterceptor implements HandlerInterceptor{
    
        //unimplemented methods comes here. Define the following method so that it     
        //will handle the request before it is passed to the controller.
    
        @Override
        public boolean preHandle(HttpServletRequest request,HttpServletResponse  response){
        //your custom logic here.
            return true;
        }
    }
    
  2. определить класс конфигурации

    @Configuration
    public class MyConfig extends WebMvcConfigurerAdapter{
        @Override
        public void addInterceptors(InterceptorRegistry registry){
            registry.addInterceptor(new MyCustomInterceptor()).addPathPatterns("/**");
        }
    }
    
  3. вот и все. Теперь все ваши запросы будут проходить через логику, определенную в методе preHandle () MyCustomInterceptor.

вы также можете рассмотреть возможность добавления зависимости SpringSandwich, которая позволяет вам напрямую аннотировать в ваших контроллерах, какие перехватчики применять, так же, как вы аннотируете свои маршруты url (раскрытие: я автор).

https://github.com/arikast/springsandwich

у меня была такая же проблема с webmvcconfigureradapter, которая устарела. Когда я искал примеры, я почти не нашел никакого реализованного кода. Вот фрагмент рабочего кода.

создать класс, который расширяет HandlerInterceptorAdapter

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import me.rajnarayanan.datatest.DataTestApplication;
@Component
public class EmployeeInterceptor extends HandlerInterceptorAdapter {
    private static final Logger logger = LoggerFactory.getLogger(DataTestApplication.class);
    @Override
    public boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {

            String x = request.getMethod();
            logger.info(x + "intercepted");
        return true;
    }

}

затем реализовать WebMvcConfigurer интерфейс

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import me.rajnarayanan.datatest.interceptor.EmployeeInterceptor;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    EmployeeInterceptor employeeInterceptor ;

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(employeeInterceptor).addPathPatterns("/employee");
    }
}