3
votes

Comment configurer une durée maximale d'une session applicative dans Tomcat?

Je dois configurer une durée maximale d'une session d'application dans Tomcat à 24 heures.

Je n'ai pas pu trouver la configuration appropriée dans la documentation:

https://tomcat.apache.org/tomcat-8.5 -doc / config / http.html

(Il y a sessionTimeout pour SSLHostConfig mais j'ai besoin de la configuration Connector ; Nous terminons la connexion SSL dans le serveur Web avant Tomcat mais la session gestion gérée par Tomcat.)

<[Ajouté

Nous avons déjà géré le délai d'expiration de la session ( Tomcat Session Timeout web.xml ) .

Le délai d'expiration de la durée maximale signifie que même l'utilisateur actif pendant toute la durée de sa session d'application sera invalidé après l'expiration de la durée maximale.


3 Réponses :



0
votes

Vous pouvez configurer une session de durée maximale en utilisant setMaxInactiveInterval

Spécifie le temps, en secondes, entre les demandes du client avant que le conteneur de servlet n'invalide cette session.

Mise à jour lors de la création de la session, en utilisant HttpSessionListener remplaçant la méthode sessionCreated :

public class MyHttpSessionListener implements HttpSessionListener{
  public void sessionCreated(HttpSessionEvent event){
    event.getSession().setMaxInactiveInterval(24*60*60); //24 Hours
  }

utilisez un HttpSessionListener. Dans la méthode sessionCreated (), vous pouvez définir le délai d'expiration de la session par programmation.


6 commentaires

Malheureusement, je ne demande pas le délai d'expiration de la session. Nous avons configuré le délai d'expiration de la session via web.xml Nous devons invalider la session même si nous avons des demandes à tout moment.


@Michael, vous pouvez ajouter WebFilter et définir setMaxInactiveInterval stackoverflow.com/questions/39564955/...


Merci, mais setMaxInactiveInterval n'est pas ce dont j'ai besoin. Je connais la solution utilisant WebFilter et HttpSessionListener. Question si vous connaissez d'autres sollutions


@Michael si vous enregistrez dans l'heure de connexion à la base de données, vous pouvez avoir une tâche de planification qui trouve les utilisateurs connectés sur une journée et invalide leur session


Merci! c'est exactement l'approche décrite dans ma réponse


@Michael vous pouvez mettre et supprimer une session utilisateur dans ConcurrentHashMap dans un gestionnaire de session singleton



4
votes

HttpSessionListener notifiera uniquement la création et la destruction de session, mais ne sera pas invoqué à chaque demande de page.

J'implémenterais un filtre pour vérifier l'heure de création de la session et invaliderais la session plus définie en-têtes ou redirection.

Dans web.xml, ajoutez:

package com.your.package;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MaxSessionDurationFilter implements Filter {

    private final long oneHourMillis = 1000*60*60;

    private long maxDuration;

    private FilterConfig filterConfig;

    @Override
    public void init(FilterConfig fc) throws ServletException {
        filterConfig = fc;
        maxDuration = Long.parseLong(filterConfig.getInitParameter("maxduration"));
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
        throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        HttpServletResponse httpResp = (HttpServletResponse) resp;
        final long creationTime = httpReq.getSession().getCreationTime();
        final long currentTime = System.currentTimeMillis();
        if (currentTime-creationTime > maxDuration*oneHourMillis) {
            httpReq.getSession().invalidate();
            // Could also set headers to 403 forbidden
            // httpResp.setStatus(HttpServletResponse.SC_FORBIDDEN);
            httpResp.sendRedirect("expiredsession.jsp");
        } else {
            chain.doFilter(req, resp);
        }
    }

    @Override
    public void destroy() { }

}

et un mappage comme

<filter-mapping>
  <filter-name>Max Session Duration</filter-name>
  <url-pattern>*.jsp</url-pattern>
</filter-mapping>

Ensuite, l'implémentation du filtre est comme:

<filter>
    <filter-name>Max Session Duration</filter-name>
    <filter-class>com.your.package.MaxSessionDurationFilter</filter-class>
    <init-param>
        <!-- Maximum session duration in hours -->
        <param-name>maxduration</param-name>
        <param-value>24</param-value>
    </init-param>
</filter>


0 commentaires