使用@Configuration注释WebSecurityConfigurerAdapter会导致两次调用config

布雷特·瑞安(Brett Ryan)

当我创建一个时,WebSecurityConfigurerAdapter它将被注册两次。我已经创建了与参考文档中的“ Hello Web Security Java配置”示例完全相同的配置

尽管Bean和过滤器链两次注册,如tomcat输出中所示,该配置仍按预期工作。

00:32:01 INFO : Root WebApplicationContext: initialization started
00:32:01 INFO : Refreshing Root WebApplicationContext: startup date [Thu Oct 09 00:32:01 EST 2014]; root of context hierarchy
00:32:01 INFO : Registering annotated classes: [class com.acme.app.config.SecurityConfig]
______________
00:32:02 INFO : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@26eed435, org.springframework.security.web.context.SecurityContextPersistenceFilter@cd9947, org.springframework.security.web.header.HeaderWriterFilter@354e8394, org.springframework.security.web.csrf.CsrfFilter@54fb62e3, org.springframework.security.web.authentication.logout.LogoutFilter@1df9cd96, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@4da923c6, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@1ee94efd, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@7d4b5722, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@26dde6a8, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@7c58b660, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6fd12384, org.springframework.security.web.session.SessionManagementFilter@24d4cc75, org.springframework.security.web.access.ExceptionTranslationFilter@1709e92c, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2c46f137]
00:32:02 INFO : Root WebApplicationContext: initialization completed in 565 ms
00:32:02 INFO : FrameworkServlet 'dispatcher': initialization started
00:32:02 INFO : Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Thu Oct 09 00:32:02 EST 2014]; parent: Root WebApplicationContext
00:32:02 INFO : Registering annotated classes: [class com.acme.app.config.WebConfig]
______________
00:32:02 INFO : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@52b26dcb, org.springframework.security.web.context.SecurityContextPersistenceFilter@10f4b535, org.springframework.security.web.header.HeaderWriterFilter@561ad054, org.springframework.security.web.csrf.CsrfFilter@4b6e4b62, org.springframework.security.web.authentication.logout.LogoutFilter@1d424a71, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@2dad3bf4, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@282a0f5c, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@52eeebb7, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@47d4a88e, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@474c5850, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6fdc40f8, org.springframework.security.web.session.SessionManagementFilter@2978de23, org.springframework.security.web.access.ExceptionTranslationFilter@5bf190dd, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@22b3fc11]

AppInitializer.java

public class AppInitializer
        extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SecurityConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}

SecurityConfig.java

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        System.out.println("______________");
        auth
                .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }

}

SecurityWebApplicationInitializer.java

public class SecurityWebApplicationInitializer
        extends AbstractSecurityWebApplicationInitializer {

}

WebConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.acme.app")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("/static/");
    }

    @Bean
    public CookieLocaleResolver getLocaleResolver() {
        CookieLocaleResolver bean = new CookieLocaleResolver();
        bean.setCookieName("clientlanguage");
        bean.setCookieMaxAge(100000);
        return bean;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        registry.addInterceptor(lci);
    }

    @Bean
    public TilesConfigurer getTilesConfigurer() {
        CustomTilesInitializer ti = new CustomTilesInitializer();
        TilesConfigurer res = new TilesConfigurer();
        res.setCompleteAutoload(true);
        res.setDefinitions("/WEB-INF/**/tiles.xml");
        return res;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.tiles();
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
        registry.addRedirectViewController("/home", "/");
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/aboutme").setViewName("aboutme");
    }

}

更新

正如@lkrnac用他的答案指出的那样,WebConfig @ComponentScan注解过程中配置两次被加载我已经知道spring将足够聪明以至于不加载它先前加载的配置。我可以将类定位在config名称空间之外,尽管这似乎很麻烦。相反,我选择提供一个排除过滤器,如下所示:

@ComponentScan(basePackages = "com.acme.app",
               excludeFilters = {
                   @Filter(type = ASSIGNABLE_TYPE,
                           value = {
                               WebConfig.class,
                               SecurityConfig.class
                           })
               })

这样,我仍然可以为我的Web上下文自由创建新的配置类,而不必担心是否包含它们。

奥尔斯克纳克

您的“安全性”配置位于软件包中com.acme.app.config.SecurityConfig该程序包在中扫描WebConfig

所以我怀疑上下文被加载了两次:

  1. 应用内初始化
  2. 通过WebConfig中的组件扫描

尝试SecurityConfigcom.acme.app包装找到

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

转到带有自定义序列的ViewController会导致两次调用viewWillAppear

来自分类Dev

为什么两次调用此函数会导致错误?

来自分类Dev

转到带有自定义序列的ViewController会导致两次调用viewWillAppear

来自分类Dev

使用KafkaSpout,两次确认元组会导致超时吗?

来自分类Dev

C ++使用矢量序列化对象会导致两次自由损坏

来自分类Dev

目标C-两次释放会导致崩溃?

来自分类Dev

servlet doGet通过servlet注释调用两次启动

来自分类Dev

Rails渲染JSON导致两次调用辅助方法

来自分类Dev

两次注释图像

来自分类Dev

为什么jQuery onclick会两次调用操作

来自分类Dev

cellForRowAtIndexPath被调用两次

来自分类Dev

ComponentwillMount被调用两次

来自分类Dev

HandleFunc被两次调用

来自分类Dev

页面被两次调用

来自分类Dev

NSNotificationCenter调用两次

来自分类Dev

UIKeyboardDidShowNotification被调用两次

来自分类Dev

UILongPressGesture被调用两次

来自分类Dev

方法被调用两次?

来自分类Dev

TraceListener调用不会阻塞,导致两次调用时崩溃

来自分类Dev

即使只调用一次,Keras Lambda 层也会运行两次

来自分类Dev

使用不同的选项两次调用grunt concat

来自分类Dev

使用两次promise调用,jQuery动画完成

来自分类Dev

JMapViewer,使用OSM并避免两次调用MouseClick事件

来自分类Dev

使用不同的参数调用函数两次

来自分类Dev

在可变的TreeSet上从/直到/范围两次调用导致空序列

来自分类Dev

在单线程上两次调用performBlockAndWait是否导致死锁?

来自分类Dev

两次调用子目标会导致该目标被跳过。怎么预防?

来自分类Dev

在循环内部创建的返回变量导致析构函数被调用两次

来自分类Dev

将React和SSR一起使用时,会导致两次下载字体和图像的原因是什么?

Related 相关文章

  1. 1

    转到带有自定义序列的ViewController会导致两次调用viewWillAppear

  2. 2

    为什么两次调用此函数会导致错误?

  3. 3

    转到带有自定义序列的ViewController会导致两次调用viewWillAppear

  4. 4

    使用KafkaSpout,两次确认元组会导致超时吗?

  5. 5

    C ++使用矢量序列化对象会导致两次自由损坏

  6. 6

    目标C-两次释放会导致崩溃?

  7. 7

    servlet doGet通过servlet注释调用两次启动

  8. 8

    Rails渲染JSON导致两次调用辅助方法

  9. 9

    两次注释图像

  10. 10

    为什么jQuery onclick会两次调用操作

  11. 11

    cellForRowAtIndexPath被调用两次

  12. 12

    ComponentwillMount被调用两次

  13. 13

    HandleFunc被两次调用

  14. 14

    页面被两次调用

  15. 15

    NSNotificationCenter调用两次

  16. 16

    UIKeyboardDidShowNotification被调用两次

  17. 17

    UILongPressGesture被调用两次

  18. 18

    方法被调用两次?

  19. 19

    TraceListener调用不会阻塞,导致两次调用时崩溃

  20. 20

    即使只调用一次,Keras Lambda 层也会运行两次

  21. 21

    使用不同的选项两次调用grunt concat

  22. 22

    使用两次promise调用,jQuery动画完成

  23. 23

    JMapViewer,使用OSM并避免两次调用MouseClick事件

  24. 24

    使用不同的参数调用函数两次

  25. 25

    在可变的TreeSet上从/直到/范围两次调用导致空序列

  26. 26

    在单线程上两次调用performBlockAndWait是否导致死锁?

  27. 27

    两次调用子目标会导致该目标被跳过。怎么预防?

  28. 28

    在循环内部创建的返回变量导致析构函数被调用两次

  29. 29

    将React和SSR一起使用时,会导致两次下载字体和图像的原因是什么?

热门标签

归档