2015-07-14 17 views
8

Devo essere in grado di memorizzare la sessione HTTP in un database relazionale per fare il bilanciamento del carico stateless dei miei utenti front-end su più server front-end. Come posso ottenere questo in primavera 4?Come posso eseguire la persistenza della sessione HTTP basata su database relazionale nella primavera 4?

Vedo come si può fare ciò con Redis, tuttavia non sembra esserci documentazione su come fare questo con un database relazionale, ad es. Postgres.

+0

Possibile duplicato di: http://stackoverflow.com/questions/20507749/how-can-i-make-the-spring-security-stores-the-http-session -in-database-so-i-can – bphilipnyc

risposta

18

Con Spring Session (in modo trasparente sovrascrive HttpSessions da Java EE), è sufficiente prendere l'interfaccia SessionRepository e implementarla con la tua ex personalizzata. JdbcSessionRepository. È un po 'facile da fare. Quando hai il tuo implementazione, poi basta aggiungere manualmente (non è necessario @EnableRedisHttpSession annotazione) creato filtro per filtrare la catena, come muggito:

@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); 
    } 
} 

Qui avete come SessionRepository interfaccia assomiglia. Ha solo 4 metodi da implementare. Per come creare l'oggetto Session, è possibile cercare nell'implementazione MapSessionRepository e MapSession (o RedisOperationsSessionRepository e RedisSession).

public interface SessionRepository<S extends Session> { 
    S createSession(); 
    void save(S session); 
    S getSession(String id); 
    void delete(String id); 
} 

soluzione Esempio https://github.com/Mati20041/spring-session-jpa-repository

+0

Grazie, puoi completare questo con un'implementazione del JDBCSessionRepository? – BestPractices

+0

Posso darvi in ​​seguito un esempio fatto in Spring Data JPA (con Database SQL come Datasource), se questo vi farà piacere. – Mati

+0

sì, e se puoi mostrare quale sia la definizione della tabella del database, sarebbe utile. – BestPractices

-1

Basta schiaffo Spring Session su di esso, e il gioco è fatto. L'aggiunta di un bean client Redis e l'annotazione di una classe di configurazione con @EnableRedisHttpSession è tutto ciò che serve.

+0

Come accennato nella domanda, non desidero farlo con Redis. Vorrei farlo nel database che ho già, Postgres. – BestPractices

+0

@BestPractices In particolare, evitare Redis non era un requisito particolarmente chiaro. Detto questo, credo che Spring Session supporti un repository JDBC (e aggiungerne uno sarebbe banale se non lo fosse). – chrylis

Problemi correlati