【问题标题】:Multiple Spring WebApplicationInitializer多个 Spring WebApplicationInitializer
【发布时间】:2019-01-03 23:48:04
【问题描述】:

在从事一个 Spring 项目时,我意识到我有三个类都在有效地实现 WebApplicationInitializer

public class SpringSessionInitializer extends AbstractHttpSessionApplicationInitializer

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer 

public class AnnotationWebAppInitializer implements WebApplicationInitializer 

看了这三种用法后,我发现我没有办法将它们结合起来,所以我有几个问题。

  1. 它们的执行顺序是否一致?
  2. 如果有,有办法订购吗?
  3. 如果没有,任何方法的主体都将 作为 addInterceptors 或 ResourceResolvers,最终清除 其他人的设置。

【问题讨论】:

  • 我自己找不到课程SpringSessionInitializer;如果是你自己的内部类,我们没办法不看就告诉你。通常,控制排序的方法是使用@Ordered 注解。请注意,添加项(如拦截器)本质上是非破坏性的。
  • 这些类都是我的类,但它们要么实现 WebApplicationInitializer 要么扩展一些可以做的事情。根据文档,这意味着当 tomcat 初始化容器时会启动。
  • 1.通常是的,2. 添加@Order,3. 不,它们是互补的(除非明确重新定义相同的 servlet 等)。

标签: java spring spring-mvc servlets spring-security


【解决方案1】:

感谢 M.Deinum 的评论,因为它让我找到了答案。在玩完@Order 标签之后,您可以控制它们加载的顺序。然而,第二部分是,是的,订单确实很重要。如果您阅读 AbstractHttpSessionApplicationInitializer 的文档,它会声明它必须在注册过滤器的任何其他初始化程序之前订购。它还将其 Order 默认设置为 100。它必须首先执行的原因是它使用过滤器从缓存数据库中检索会话。例如,如果您将 AbstractSecurityWebApplicationInitializer 设置为 50,则在切换服务器时将不再进行身份验证,因为 spring 安全过滤器将在从数据库获取会话的过滤器之前执行。

另一方面,我删除了一个我得到 Spring-Tomcat Web Application java.lang.IllegalStateException 的错误,通过让我的主初始化程序 AnnotationWebAppInitializer 先于其他程序来解决。

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2012-02-28
    • 2012-10-24
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2022-08-02
    相关资源
    最近更新 更多