0

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

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

但是,我想从 db 层附近的服务访问它,因为我认为将请求传递给服务不是一个好的设计实践,所以我尝试自动装配它,但它没有找到这样的 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;
}
4

1 回答 1

0

我的猜测是在调用之前RequestContextHolder捕获了。这意味着该请求还没有被包装。HttpServletRequestSessionRepositoryFilter

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

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

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

于 2014-12-08T14:46:22.823 回答