Добавить фильтр сервлета в приложение загрузки Spring
Я хочу, чтобы ETag suport. Для этого существует ShallowEtagHeaderFilter
, который выполняет всю работу. Как я могу добавить его, не объявив его в моем web.xml
(которого на самом деле не существует, потому что я как-то обошел его без него)?
P.S. Я использую Spring Boot 1.1.4
P.P.S. Здесь полное решение
package cuenation.api;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ShallowEtagHeaderFilter;
import javax.servlet.DispatcherType;
import java.util.EnumSet;
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean shallowEtagHeaderFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new ShallowEtagHeaderFilter());
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
registration.addUrlPatterns("/cue-categories");
return registration;
}
}
Ответы
Ответ 1
При использовании Spring Boot
Как упомянутый в справочной документации, нужно только объявить этот фильтр как Bean в классе конфигурации, чтобы он!
@Configuration
public class WebConfig {
@Bean
public Filter shallowEtagHeaderFilter() {
return new ShallowEtagHeaderFilter();
}
}
При использовании Spring MVC
Вероятно, вы уже расширили WebApplicationInitializer
. Если нет, то вы должны преобразовать конфигурацию webapp из файла web.xml
в класс WebApplicationInitializer
.
Если ваша конфигурация контекста находится в XML файле (-ях), вы можете создать класс, который расширяет AbstractDispatcherServletInitializer
- при использовании классов конфигурации AbstractAnnotationConfigDispatcherServletInitializer
является правильным выбором.
В любом случае вы можете добавить регистрацию фильтра:
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new ShallowEtagHeaderFilter();
};
}
Полные примеры инициализации контейнера сервлетов на основе кода доступны в справочной документации Spring.
Ответ 2
Немного поздний ответ.
Мое решение состояло в создании пользовательской аннотации:
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;
// ...
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface Filter {
@AliasFor(annotation = Component.class, attribute = "value")
String value() default "";
}
И затем просто примените его к реализациям фильтра:
@Filter
public class CustomFilter extends AbstractRequestLoggingFilter {
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
logger.debug("before req params:", request.getParameterMap());
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
logger.debug("after req params:", request.getParameterMap());
}
}
Подробнее: @AliasFor
, Spring вопрос по аннотациям