【问题标题】:How should I use custom SiteMeshFilter with an implementation of Spring's AbstractAnnotationConfigDispatcherServletInitializer?我应该如何将自定义 SiteMeshFilter 与 Spring 的 AbstractAnnotationConfigDispatcherServletInitializer 的实现一起使用?
【发布时间】:2013-08-04 04:51:43
【问题描述】:

我的项目中有一个 SiteMeshFilter 的有效实现,但是自从转移到扩展 AbstractAnnotationConfigDispatcherServletInitializer 而不是 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);
}

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

【问题讨论】:

    标签: spring-mvc spring-security sitemesh


    【解决方案1】:

    我认为应该解决三件事:

    • 首先,在新配置中,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());
        }
    }
    

    【讨论】:

    • 感谢您抽出宝贵时间回复。我已经实施了建议的更改,但 Sitemesh 仍然没有添加它的装饰。我已将我的 SitemeshFilter 代码添加到问题中以供参考。
    • 在 Spring Security 崩溃之前你是如何应用它的?你能包括这个设置吗?如果您不使用 Spring Security,它是否有效?
    • 我没有,我现在正在尝试添加安全性。这似乎在起作用,因为我被拒绝访问定义的某些 URL,但 Freemarker 模板没有任何样式。
    • 所以如果你使用你的新配置,但不使用安全性,它会起作用吗?
    • 如果您尝试在两者中都初始化 Root ApplicationContext 可能会导致错误,但由于您的 AbstractSecurityWebApplicationInitializer 子类没有传递任何配置,它所做的就是像往常一样连接 springSecurityFilterChain网页.xml。有关支持它的文档,请参见此处(注意我是编写文档的人;))static.springsource.org/spring-security/site/docs/…
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2019-04-20
    • 2016-08-29
    • 2019-05-31
    • 2016-06-29
    相关资源
    最近更新 更多