8

イニシャライザに次のコードがあります。

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Filter[] getServletFilters() {

        DelegatingFilterProxy shiroFilter = new DelegatingFilterProxy("shiroFilter");
        shiroFilter.setTargetFilterLifecycle(true);

        return new Filter[]{new CorsFilter(),shiroFilter};
    }
}

CorsFilterの前に処刑されたいShiroFilter。ただし、Spring のドキュメントには、フィルターが実行される順序が、返された配列内の順序によって決定されるとは記載されていません。

もしそうなら、誰かがそれを明確にしてもらえますか? そうでない場合、誰かがフィルターの実行順序を保証する方法を提案できますか?

4

3 に答える 3

13

質問を最新の状態に保つためだけに。

スプリング@Order - アノテーションを使用する

@Component(value = "myCorsFilter")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {

    [...]

}

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { AppConfiguration.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { 
             new DelegatingFilterProxy("myEncodingFilter"), 
             new DelegatingFilterProxy("myCorsFilter"),    // or just new CorsFilter()
             new DelegatingFilterProxy("mySecurityFilter") //...
        };
    }

}
于 2016-01-16T08:12:04.940 に答える
4

フィルターは配列の順に登録されます。

これによりServletContext.addFilter()、アイテムの順序で呼び出されることになりますが、これが実際にコンテナーによってフィルターが登録された順序で実行されるかどうかはわかりません。

たとえば、Tomcat はHashMap を使用してフィルターを格納しているように見えるため、フィルターが追加された順序で実行されるとは限りません。

Springorg.springframework.web.filter.CompositeFilterCompositeFilter.

于 2013-12-17T23:18:37.487 に答える