如何在Spring 4中执行基于关系数据库的HTTP会话持久性?

时间:2015-07-14 01:55:37

标签: spring spring-mvc spring-security

我需要能够将HTTP会话存储在关系数据库中,以便跨多个前端服务器对前端用户进行无状态负载平衡。我怎样才能在Spring 4中实现这一目标?

我知道如何使用Redis做到这一点,但似乎没有关于如何使用关系数据库执行此操作的文档,例如Postgres的。

3 个答案:

答案 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对象,您可以查看MapSessionRepositoryMapSession实现(或RedisOperationsSessionRepositoryRedisSession)。

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注释配置类即可。