我的项目中有一个SiteMeshFilter的工作实现,但是由于没有使用我的sitemesh过滤器来扩展AbstractAnnotationConfigDispatcherServletInitializer而不是WebApplicationInitializer。
我一直在尝试理解以下有关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设置。可能没有点击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 :(得分:0)
我认为应该解决三件事:
首先,在新配置中,SitemeshFilter被注册为仅应用于DispatcherServlet处理的请求,与每个URL相关联。要匹配原始配置,我会更新您的SitemeshFilter以处理每个网址。
第二个是你的原始配置没有提到Spring Security。如果我的反馈没有帮助,也许您可以详细说明您之前是如何做的(并提供相关配置...即web.xml)。
我建议您确保将springSecurityFilterChain应用于每个URL,而不是仅应用DispatcherServlet处理的URL。
进行以下更改应解决上述所有问题:
首先删除getServletFilters()
接下来创建一个类似于以下代码的类:
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
protected void afterSpringSecurityFilterChain(ServletContext servletContext) {
insertFilters(servletContext, new SitmeshFilter());
}
}