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


问题内容

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

我知道如何使用Redis做到这一点,但是似乎没有关于如何使用关系数据库(例如Postgres)做到这一点的文档。


问题答案:

使用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