【问题标题】:Spring: Get SessionRegistry without modifying any XML files?Spring:在不修改任何 XML 文件的情况下获取 SessionRegistry?
【发布时间】:2014-01-06 19:21:13
【问题描述】:

根据this one之类的文章,完全可以不用修改任何xml文件就可以使用Spring。所以在不修改任何 XML 文件的情况下,我尝试使用 SessionRegistry 访问所有当前登录的用户,就像 here 一样。到目前为止,我尝试过的是,首先,创建一个像这样的 Bean:

@Configuration
public class SomeClass {   
[...]
    @Bean
    SessionRegistry sessionRegistry() {
        return new SessionRegistryImpl();
    }
[...]
}

然后在我的控制器中注入 Bean:

@Controller
public class SomeController {

    @Resource(name = "sessionRegistry")
    private SessionRegistryImpl sessionRegistry;

    @RequestMapping(value = { "/"})
    public String list() {
        List<Object> principals = sessionRegistry.getAllPrincipals();
    }
[...]
}

但是每当我打印出principals 时,我都会得到一个空列表。所以我的假设可能是,仅仅按照我的方式创建 Bean 是不够的。但为什么?您对如何继续有任何建议?

【问题讨论】:

  • 什么是SessionRegistryImpl
  • 它是org.springframework.security.core.session.SessionRegistryImpl
  • 我相信这是一个应该由 Spring security 管理的类,而不是你。显然,当您没有添加任何内容时调用 getAllPrincipals 将返回一个空列表。
  • 好吧,我只是按照使用该类的本教程(krams915.blogspot.de/2010/12/spring-security-mvc-querying.html)进行操作。
  • 本教程似乎不仅仅是声明一个SessionRegistryImpl bean。你做了所有这些吗?它似乎需要一个ConcurrentSessionFilter bean 和一堆其他配置。

标签: xml spring session javabeans


【解决方案1】:

首先,您需要确保在 Spring Security 配置中使用会话存储库。我猜目前您正在使用不同的 SessionRepository 实例。例如:

protected void configure(
        HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .and()
        .sessionManagement()
            .maximumSessions(1)

                // This line is important otherwise a default instance
                // will be used that is different than your Bean
                .sessionRegistry(sessionRegistry())
                .expiredUrl("/login?expired");
}

@Bean
SessionRegistry sessionRegistry() {
    return new SessionRegistryImpl();
}

接下来,您需要确保指定了 HttpSessionEventPublisher。这可以使用以下方法完成:

public class SecurityInitializer extends
        AbstractSecurityWebApplicationInitializer {

    @Override
    protected boolean enableHttpSessionEventPublisher() {
        return true;
    }
}

另请注意,您需要将@Resource 类型更改为SessionRegistry 而不是SessionRegistryImpl。例如:

@Resource(name = "sessionRegistry")
private SessionRegistry sessionRegistry;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 2011-06-13
    • 2011-04-22
    • 2022-06-10
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多