Подтвердить что ты не робот

Как определить порядок выполнения сервлет-фильтра в приложении 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, поскольку оно касается только фильтра проверки с приведенной выше конфигурацией. Я ценю любые материалы для решения этой проблемы. Благодаря

4b9b3361

Ответ 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" ).