我应该如何将自定义 SiteMeshFilter 与 Spring 的 AbstractAnnotationConfigDispatcherServletInitializer 的实现一起使用?



我的项目中有一个SiteMeshFilter的工作实现,但由于扩展了AbstractAnnotationConfigDispatcherServlet Initializer而不是WebApplicationInitializer,我的sitemesh筛选器没有被使用。

我一直在努力理解以下关于Spring安全性的教程http://blog.springsource.org/2013/07/03/spring-security-java-config-preview-web-security/和http://tux2323.blogspot.co.uk/

不确定是安全性阻碍了还是我以某种方式错误配置了Initializer/Dispatcher。。。。

旧配置(扩展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);
}

新配置(扩展AbstractAnnotationConfigDispatcherServlet Initializer):

    @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的设置。可能是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");
  }
}

我看到了应该解决的三件事:

  • 第一个是,在新配置中,SitemeshFilter被注册为仅适用于DispatcherServlet处理的与每个URL相关的请求。为了匹配原始配置,我会更新您的SitemeshFilter以处理每个URL。

  • 第二个原因是您的原始配置没有提到Spring Security。如果我的反馈没有帮助,也许你可以详细说明你以前是如何做到这一点的(并提供相关的配置…即web.xml)

  • 我建议您确保将springSecurityFilterChain应用于每个URL,而不是仅应用于DispatcherServlet处理的URL。

进行以下更改应解决以上所有问题:

首先删除getServlet过滤器()

接下来创建一个类似以下代码的类:

public class SecurityWebApplicationInitializer 
     extends AbstractSecurityWebApplicationInitializer {
    protected void afterSpringSecurityFilterChain(ServletContext servletContext) {
        insertFilters(servletContext, new SitmeshFilter());
    }
}

最新更新