3

プロジェクトで SiteMeshFilter の実用的な実装がありましたが、WebApplicationInitializer の代わりに AbstractAnnotationConfigDispatcherServletInitializer の拡張に移行して以来、私のサイトメッシュ フィルターは使用されていません。

Spring セキュリティに関する次のチュートリアルhttp://blog.springsource.org/2013/07/03/spring-security-java-config-preview-web-security/およびhttp://tux2323 を理解しようとしています。 blogspot.co.uk/

セキュリティが邪魔をしているのか、それともイニシャライザ/ディスパッチャの設定が間違っているのかわかりません....

古い構成 (WebApplicationInitializer を拡張):

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("yhj dispatcher", new DispatcherServlet(applicationContext));
    dispatcher.addMapping("/");
    dispatcher.setLoadOnStartup(1);
    servletContext.addFilter("sitemeshFilter", new     SitemeshFilter()).addMappingForUrlPatterns(null, false, "/*");
applicationContext.register(MvcConfiguration.class);
}

新しい構成 (AbstractAnnotationConfigDispatcherServletInitializer の拡張):

    @Override
public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
    }
    @Override
protected String[] getServletMappings() {
    return new String[] {"/"};
}

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

@Override
protected Filter[] getServletFilters() {
    return new Filter[]{new SitemeshFilter(), new DelegatingFilterProxy("springSecurityFilterChain") };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] {MvcConfiguration.class, PersistanceConfig.class};
}

他の構成クラス/SitemeshFilter は変更されていないので、問題ないことに満足しています。実際、サイトにアクセスすると、データベースからのデータを含む完全なページが表示されますが、Sitemesh によってスタイルが設定されていません。サイトメッシュ フィルターがヒットしていない可能性はありますか?

SitemeshFilter.java:

public class SitemeshFilter extends ConfigurableSiteMeshFilter {
@Override
protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
    builder.setMimeTypes("text/html", "application/xhtml+xml");
    builder.addDecoratorPath("/*", "/WEB-INF/templates/page.jsp");
  }
}
4

1 に答える 1

0

対処すべき 3 つのことがわかります。

  • 1 つ目は、新しい構成では SitemeshFilter が登録され、すべての URL に適用される DispatcherServlet によって処理されるリクエストにのみ適用されることです。元の構成に一致させるために、すべての URL を処理するように SitemeshFilter を更新します。

  • 2 つ目は、元の構成で Spring Security が言及されていないことです。私のフィードバックが役に立たない場合は、おそらく以前にこれをどのように行っていたかを詳しく説明してください(関連する構成を提供してください...つまりweb.xml)。

  • DispatcherServlet によって処理される URL だけでなく、すべての URL に springSecurityFilterChain を適用することをお勧めします。

次の変更を行うと、上記のすべての点に対処する必要があります。

最初に getServletFilters() を削除します

次に、次のコードのようなクラスを作成します。

public class SecurityWebApplicationInitializer 
     extends AbstractSecurityWebApplicationInitializer {

    protected void afterSpringSecurityFilterChain(ServletContext servletContext) {
        insertFilters(servletContext, new SitmeshFilter());
    }
}
于 2013-08-11T02:29:01.587 に答える