所以我正在使用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;
}
答案 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来解决它。