How can I do relational database-based HTTP Session Persistence in Spring 4?
With Spring Session (it transparently will override HttpSessions from Java EE) you can just take SessionRepository
interface and implement it with your custom ex. JdbcSessionRepository
. It is kind of easy to do. When you have your implementation, then just add manually (you don't need @EnableRedisHttpSession
annotation) created filter to filter chain, like bellow:
@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);
}
}
Here you have how SessionRepository
interface looks like. It has only 4 methods to implement. For how to create Session object, you can look in MapSessionRepository
and MapSession
implementation (or RedisOperationsSessionRepository
and RedisSession
).
public interface SessionRepository<S extends Session> {
S createSession();
void save(S session);
S getSession(String id);
void delete(String id);
}
Example solution https://github.com/Mati20041/spring-session-jpa-repository