如何在Spring中自动装配HttpSessionManager Bean?

时间:2014-12-08 12:37:57

标签: spring-session

所以我正在使用spring-session项目,我想知道是否可以自动装配HttpSessionManager bean?我可以在users示例中看到您从请求中获取了SessionRepository

    HttpSessionManager sessionManager =
            (HttpSessionManager) req.getAttribute(HttpSessionManager.class.getName());
    SessionRepository<Session> repo =
            (SessionRepository<Session>) req.getAttribute(SessionRepository.class.getName());

但是,我想从数据库层附近的服务访问它,因为我不认为将请求传递给我试图自动装配它的服务是一个很好的设计实践,但它没有&#39 ;找到这种类型的bean。 SessionRepository可以自动装配,因为我在配置中定义了bean。我也尝试使用RequestContextHolder来获取它,但是getSessionIds方法总是返回空映射,所以我最终会一直创建一个新的会话。这是我的整个方法:

@Override
public Session getCurrentSession() {

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

    HttpSessionManager sessionManager =
        (HttpSessionManager) request.getAttribute(HttpSessionManager.class.getName());

    final Map<String, String> sessionIds = sessionManager.getSessionIds(request);

    if (sessionIds != null) {

        for (Map.Entry<String, String> e : sessionIds.entrySet()) {
            final Session session = sessionRepository.getSession(e.getValue());
            if (session != null) {
                return session;
            }
        }
    }

    Session session = sessionRepository.createSession();

    sessionRepository.save(session);

    return session;
}

1 个答案:

答案 0 :(得分:0)

我的猜测是RequestContextHolder在调用HttpServletRequest之前捕获SessionRepositoryFilter。这意味着请求尚未被包装。

默认情况下,EnableRedisHttpSession配置不会将CookieHttpSessionStrategy公开为Bean。这是必要的,以便允许用户覆盖SessionStrategy并支持旧版本的Spring(较新版本的Spring支持@Conditional)。如果您希望将CookieHttpSessionStrategy公开为Bean,则可以将以下内容添加到您的配置中:

@Bean
public CookieHttpSessionStrategy sessionStragegy() {
    return new CookieHttpSessionStrategy();
}

在考虑了一些之后,我可以在将来的版本中公开它。我创建了gh-spring-session-75来解决它。