2016-07-29 1 views
2

J'utilise Spring Sessions avec Postgres. Les sessions sont conservées dans ma base de données Postgres en utilisant le JdbcOperationsSessionRepository.Pourquoi mes Spring Sessions sont-elles supprimées de mon magasin JDBC?

La période d'inactivité par défaut que j'utilise pour mes sessions est de 30 jours. Une fois qu'un utilisateur se connecte, je le fais request.getSession().setMaxInactiveInterval() et le change en 180 jours.

Toutefois, pour une raison quelconque, les 180 jours ne sont pas respectés et les sessions sont supprimées toutes les heures. Par exemple:

Cette séance aurait duré 180 jours, mais il a été supprimé dès l'heure suivante a commencé.

Est-ce que quelqu'un sait comment je peux empêcher ces sessions d'être supprimées et les faire rester pendant 180 jours?

Je suppose que this function a quelque chose à voir avec ça.

est ici la partie de mon application qui étend l'intervalle inactif max de l'utilisateur:

private void setupSession(HttpServletRequest request, User user) { 
    HttpSession session = request.getSession(); 
    session.setMaxInactiveInterval(15552000); 
    session.setAttribute("user-id", user.id); 
} 
+0

Pouvez-vous poster votre configuration? – codependent

+0

Si j'ai bien compris ... vous voulez que les utilisateurs non identifiés aient une durée d'expiration de session de 30 jours et 180 jours d'utilisateurs connectés? – codependent

+0

Il s'avère que c'est un bug dans la bibliothèque: https://github.com/spring-projects/spring-session/issues/580 – RainSear

Répondre

0

Comme indiqué dans les commentaires, cela est un problème avec l'intégration Spring Session JDBC qui a été rapporté dans gh-580. Pour contourner ce problème jusqu'à ce que la solution soit livrée, vous pouvez étendre le JdbcOperationsSessionRepository et remplacer la méthode cleanUpExpiredSessions. Après cela, vous devez simplement remplacer le bean de référentiel de session JDBC par défaut en fournissant votre bean qui s'étend JdbcOperationsSessionRepository et est nommé sessionRepository (le nom du bean est important car il doit correspondre à celui de JdbcHttpSessionConfiguration afin de le remplacer).

Par exemple:

@EnableJdbcHttpSession 
class SessionConfig { 

    // omitted data source & tx manager config 

    @Bean 
    MyJdbcOperationsSessionRepository sessionRepository(...) { 
     return new ... 
    } 

} 

Vous pouvez trouver la solution pour cleanUpExpiredSessions décrite dans les commentaires sur gh-580.