Как определить порядок выполнения сервлет-фильтра в приложении Spring Загрузка
Я пытаюсь установить порядок выполнения 2-х фильтров в моем загрузочном приложении spring, которые имеют одинаковое отображение URL-адресов. Я пробовал использовать 2 регистрации фильтра beans в моем основном классе приложений, как показано ниже, но это не сработало. Я хочу, чтобы authorizationFilter
ударил сначала, а затем validationFilter
. Но он всегда попадает ТОЛЬКО validationFilter
, когда оба настроены. Если я прокомментирую validationFilter
, он попадет в authorizationFilter
.
@Bean
public FilterRegistrationBean authorizationFilter(){
FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
filterRegBean.setFilter(authorizationFilter);
List<String> urlPatterns = new ArrayList<String>();
urlPatterns.add("/v1/*");
filterRegBean.setUrlPatterns(urlPatterns);
return filterRegBean;
}
@Bean
public FilterRegistrationBean validationFilter(){
FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
filterRegBean.setFilter(validationFilter);
List<String> urlPatterns = new ArrayList<String>();
urlPatterns.add("/v1/*");
filterRegBean.setUrlPatterns(urlPatterns);
return filterRegBean;
}
Я также попытался представить web.xml
и преобразовать исполняемую банку в военный файл.
<web-app>
<filter>
<filter-name>authorizationFilter</filter-name>
<filter-class>com.security.filter.AuthorizationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authorizationFilter</filter-name>
<url-pattern>/v1/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>validationFilter</filter-name>
<filter-class>com.security.validation.ValidationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>validationFilter</filter-name>
<url-pattern>/v1/*</url-pattern>
</filter-mapping>
</web-app>
Но приложение, похоже, не распознает web.xml, поскольку оно касается только фильтра проверки с приведенной выше конфигурацией.
Я ценю любые материалы для решения этой проблемы.
Благодаря
Ответы
Ответ 1
setOrder(int)
метод выполняет эту работу.
ниже приведен пример
@Configuration
@EnableAutoConfiguration
@EnableWebMvc
@ComponentScan
public class Application {
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
SecurityFilter securityFilter = new SecurityFilter();
registrationBean.setFilter(securityFilter);
registrationBean.setOrder(2);
return registrationBean;
}
@Bean
public FilterRegistrationBean contextFilterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
RequestContextFilter contextFilter = new RequestContextFilter();
registrationBean.setFilter(contextFilter);
registrationBean.setOrder(1);
return registrationBean;
}
}
Ответ 2
Spring Загружает ваш FilterRegistrationBean
с помощью AnnotationAwareOrderComparator
, прежде чем применять их к контексту сервлета. RegistrationBean
в настоящее время не является Ordered
, поэтому нет способа установить порядок, вызвав метод, но вы можете обойти это, создав подклассы и добавив к ним @Order
. Я думаю, что создание базового класса Ordered
и предоставление сеттера - это, вероятно, полезная вещь в рамках (откройте вопрос о github, если вы согласитесь).
Обновление: Ordered
добавлено в 1.0.x.
Ответ 3
Bean имя решит вашу проблему: @ Bean ( "aFilter" ).