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

标签 spring spring-mvc spring-security

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

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

最佳答案

使用 Spring Session(它会透明地覆盖 Java EE 中的 HttpSessions),您只需使用 SessionRepository接口(interface)并使用您的自定义前实现它。 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

关于spring - 如何在 Spring 4 中进行基于关系数据库的 HTTP session 持久性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31396362/

相关文章:

java - 在 Spring MVC 中使用 HttpServletRequest 之前替换/准备原始 POST 数据

tomcat - 为什么 Tomcat 的线程比后台线程成本更高?

grails - UrlEncodedSlash 被 HttpFirewall 阻止(Grails 3.3.0.RC1;Spring-security-core 3.2.0.M1)

java - Spring security 4 @PreAuthorize ("hasRole()")不工作

java - @Value 无需配置静态 PropertySourcesPlaceholderConfigurer 即可工作

java - 无法在 mybatis+jersey Web 应用程序上集成 spring

java - 如何在 Spring MVC 异常处理程序中访问 @PathVariable?

spring - 如何调试Spring Security授权注解?

java - Spring 的秒 :intercept-url easily bypassed?

java - Spring JDBC 支持和大型数据集