2013-08-02 51 views
3

我在我的项目中有一个SiteMeshFilter的工作实现,但是由于移动到扩展AbstractAnnotationConfigDispatcherServletInitializer而不是WebApplicationInitializer,我的sitemesh过滤器没有被使用。我应该如何使用Spring的AbstractAnnotationConfigDispatcherServletInitializer实现自定义SiteMeshFilter?

我一直在试图了解在春季安全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所打造。可能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"); 
    } 
} 

回答

0

我看应该解决三两件事:

  • 首先是在新配置的SitemeshFilter正在注册,只适用于请求由DispatcherServlet处理,与每个URL一致。要匹配原始配置,我会更新SitemeshFilter以处理每个URL。

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

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

做以下修改应当解决上述各点:

首先拆下getServletFilters()

接下来,创建一个类,它看起来像下面的代码:

public class SecurityWebApplicationInitializer 
    extends AbstractSecurityWebApplicationInitializer { 

    protected void afterSpringSecurityFilterChain(ServletContext servletContext) { 
     insertFilters(servletContext, new SitmeshFilter()); 
    } 
} 
+0

三江源花时间回应。我已经实施了建议的更改,但Sitemesh仍未添加其装饰。 我已将SitemeshFilter代码添加到该问题以供参考。 – DaFoot

+0

Spring Security在破解之前是如何应用的?你能包括这个设置吗?如果你没有使用Spring Security,它会起作用吗? –

+0

我没有,我正在尝试增加安全性。这似乎是在工作,我被拒绝访问一些URL定义,但Freemarker模板没有任何样式。 – DaFoot

相关问题