2015-07-14 7 views
8

Potrzebuję móc przechowywać sesję HTTP w relacyjnej bazie danych w celu przeprowadzenia bezstanowego równoważenia obciążenia moich użytkowników zewnętrznych na wielu serwerach front-end. Jak mogę to osiągnąć na wiosnę 4?Jak mogę wykonać relacyjną zależność sesji HTTP opartą na bazie danych w Spring 4?

Widzę, jak można to zrobić z Redis, jednak wydaje się, że nie ma dokumentacji, jak to zrobić z relacyjną bazą danych, np. Postgres.

+0

Możliwe duplikat: http://stackoverflow.com/questions/20507749/how-can-i-make-the-spring-security-stores-the-http-session -in-database-so-i-can – bphilipnyc

Odpowiedz

18

Z sesją wiosenną (przezroczyście zastąpi HttpSessions z Java EE) można po prostu wziąć interfejs SessionRepository i zaimplementować go z niestandardowym ex. JdbcSessionRepository. Jest to łatwe do zrobienia. Gdy masz implementację, a potem po prostu dodać ręcznie (nie trzeba @EnableRedisHttpSession adnotacji) utworzona filtr filtrować łańcuch, jak poniżej:

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

Tutaj masz jak SessionRepository interfejs wygląda. Ma tylko 4 metody do wdrożenia. Aby dowiedzieć się, jak utworzyć obiekt Session, można zajrzeć do implementacji MapSessionRepository i MapSession (lub RedisOperationsSessionRepository i RedisSession).

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

Przykład rozwiązania https://github.com/Mati20041/spring-session-jpa-repository

+0

Dzięki, czy możesz uzupełnić to o implementację JDBCSessionRepository? – BestPractices

+0

Mogę podać później przykład utworzony w Spring Data JPA (z bazą danych SQL jako źródłem danych), jeśli ci się to spodoba. – Mati

+0

tak, i jeśli możesz pokazać, co jest definicją tabeli bazy danych, byłoby to pomocne. – BestPractices

-1

Po prostu upuść sesję wiosenną i już gotowe. Dodawanie fasoli klienta Redis i dodawanie adnotacji do klasy konfiguracji za pomocą @EnableRedisHttpSession jest wszystkim, czego potrzebujesz.

+0

Jak wspomniano w pytaniu, nie chcę tego robić z Redis. Chciałbym to zrobić w bazie danych, którą już posiadam, Postgres. – BestPractices

+0

@BestPractices Unikanie Redis nie było szczególnie jasne. To powiedziawszy, uważam, że Spring Session obsługuje repozytorium JDBC (a dodanie jednego byłoby banalne, jeśli nie). – chrylis

Powiązane problemy