我需要能够将HTTP会话存储在关系数据库中,以便跨多个前端服务器对前端用户进行无状态负载平衡。我怎样才能在Spring 4中实现这一目标?
我知道如何使用Redis做到这一点,但似乎没有关于如何使用关系数据库执行此操作的文档,例如Postgres的。
答案 0 :(得分:20)
使用Spring Session(它透明地将覆盖来自Java EE的HttpSessions),您可以使用SessionRepository
接口并使用您的自定义ex实现它。 JdbcSessionRepository
。这很容易做到。实施后,只需手动添加(您不需要@EnableRedisHttpSession
注释)创建过滤器来过滤链,如下所示:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
//other stuff...
@Autowired
private SessionRepository<ExpiringSession> sessionRepository;
private HttpSessionStrategy httpSessionStrategy = new CookieHttpSessionStrategy(); // or HeaderHttpSessionStrategy
@Bean
public SessionRepository<ExpiringSession> sessionRepository() {
return new JdbcSessionRepository();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
SessionRepositoryFilter<ExpiringSession> sessionRepositoryFilter = new SessionRepositoryFilter<>(sessionRepository);
sessionRepositoryFilter.setHttpSessionStrategy(httpSessionStrategy);
http
.addFilterBefore(sessionRepositoryFilter, ChannelProcessingFilter.class);
}
}
这里有SessionRepository
界面的样子。它只有4种方法可以实现。有关如何创建Session对象,您可以查看MapSessionRepository
和MapSession
实现(或RedisOperationsSessionRepository
和RedisSession
)。
public interface SessionRepository<S extends Session> {
S createSession();
void save(S session);
S getSession(String id);
void delete(String id);
}
示例解决方案https://github.com/Mati20041/spring-session-jpa-repository
答案 1 :(得分:0)
现在spring boot通过'spring-session-jdbc'支持。您可以使用更少的代码将会话保存到db中。有关更多示例,您可以查看https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-jdbc.html#httpsession-jdbc-boot-sample
答案 2 :(得分:-1)
刚刚打开Spring Session,你就完成了。只需添加Redis客户端bean并使用@EnableRedisHttpSession
注释配置类即可。