gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:00:36 25 4
gpt4 key购买 nike

我在我的项目中有一个 SiteMeshFilter 的工作实现,但是自从转向扩展 AbstractAnnotationConfigDispatcherServletInitializer 而不是 WebApplicationInitializer 之后,我的 sitemesh 过滤器就没有被使用。

我一直在努力理解以下有关 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");
}
}

最佳答案

我看到了三个应该解决的问题:

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

关于spring-mvc - 我应该如何将自定义 SiteMeshFilter 与 Spring 的 AbstractAnnotationConfigDispatcherServletInitializer 的实现一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18024999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com