2016-09-19 4 views
1

J'ai dans mon application interroger des requêtes HTTP qui s'exécutent toutes les 5 minutes.Session HTTP: comment configurer les URL qui ne modifient pas l'expiration de la session?

Je souhaite configurer ces URL pour ne pas modifier l'expiration de la session. Sinon, ma session n'aura jamais expiré (et je ne le veux pas). Impossible de le trouver dans la documentation web.xml et HttpSession.

Comment est-ce possible de le faire?

Ajouté

précision très importante: la demande doit être authentifié. Cela signifie que la requête doit être attachée à JsessionID qui est déjà authentifié.

Précision (Ajouté 2)

Je ne veux pas que la session expire indépendamment du fait que l'utilisateur reste actif ou non. Je veux que la session expire sur l'inactivité de l'utilisateur et n'expire pas si l'utilisateur travaille sur l'interface utilisateur. Je souhaite que la session expire sur l'inactivité de l'utilisateur malgré les demandes d'interrogation toutes les 5 minutes

+0

Ne fixez pas JSESSIONID (enlever ou mettre à autre chose) à cette demande, de sorte que le serveur pense que sa nouvelle demande. –

+0

La requête doit être authentifiée – Michael

+0

jsessionid est la chose dont dépend le serveur pour identifier la session. Pouvez-vous obtenir les informations de l'utilisateur en utilisant un autre identifiant comme un cookie différent et supprimer jsessionid de ces demandes? –

Répondre

2

Ceci n'est pas pris en charge par l'API Servlet standard. Votre meilleur pari est de créer un filtre de servlet global (avec @WebFilter("/*")) qui diminue le HttpSession#setMaxInactiveInterval() chaque fois que l'URL particulière atteint le serveur, et le remet à la valeur par défaut pour les autres URL. Cela nécessite seulement un peu de maths de base.

Les bits pertinents de la mise en œuvre peuvent ressembler à ceci:

private static final int DEFAULT_EXPIRE_TIME_IN_SECONDS = 1800; 
private static final String SKIP_EXPIRE_TIME_ON_URI = "/somePollServlet"; 

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpSession session = request.getSession(); 

    if (request.getRequestURI().equals(request.getContextPath() + SKIP_EXPIRE_TIME_ON_URI)) { 
     long lastAccessedTime = session.getLastAccessedTime(); 
     long currentTime = System.currentTimeMillis(); 
     int newExpireTime = DEFAULT_EXPIRE_TIME_IN_SECONDS - (int) ((currentTime - lastAccessedTime)/1000); 
     session.setMaxInactiveInterval(newExpireTime); 
    } 
    else { 
     session.setMaxInactiveInterval(DEFAULT_EXPIRE_TIME); 
    } 

    chain.doFilter(req, res); 
} 
+0

Le filtre peut-il lire la valeur du délai d'attente de session à partir de web.xml? ' 5 ' – Michael

+1

@Michael: également pas par API standard: http://stackoverflow.com/q/17528373 Alternative est se souvenir du premier appel de 'getMaxInactiveInterval()' en session. – BalusC

-1

Dans votre cas, vous avez besoin d'un schéma de gestion de session qui expirera dans N minutes, que l'utilisateur reste actif ou non. De cette façon, vous n'avez pas besoin de passer une authentification ou des cookies par défaut.

Vous pouvez y parvenir en utilisant deux méthodes proposées here.

  1. une tâche planifiée qui invalide la session après N minutes de connexion
  2. un en-tête et de l'approche à base de filtre pour décider de l'expiration de session dynamique.
+0

ce n'est pas ce dont j'ai besoin. Je ne veux pas que la session expire, que l'utilisateur reste actif ou non. Je veux que la session expire sur l'inactivité de l'utilisateur et n'expire pas si l'utilisateur travaille sur l'interface utilisateur. Je veux que la session expire sur l'inactivité de l'utilisateur malgré les demandes d'interrogation qui arrivent toutes les 5 minutes – Michael

0

Il existe de nombreuses approches pour ce faire. L'un d'eux est d'utiliser un javascript par exemple JQuery. L'idée principale est de savoir si un script interroge le serveur, s'il n'y a pas d'activité sur l'application par l'utilisateur, par exemple une pression sur une touche, un mouvement de la souris etc. pendant une durée raisonnable, il faut considérer que l'utilisateur n'est pas présent. le javascript doit appeler l'URL de déconnexion pour vos applications. Veuillez vous référer à l'URL fournie qui explique très bien le concept.

+0

Comment le plugin peut-il distinguer une requête provoquée par une activité de l'utilisateur (par exemple une pression de touche, un mouvement de souris etc.) et la requête de pooling? – Michael

+0

Les activités de l'utilisateur sont généralement modélisées en tant qu'événements du moteur JS pouvant être traités, l'interrogation étant en revanche une activité effectuée à partir du moteur, par ex. $ http appels dans Angular etc les événements peuvent être suivis par le cadre et l'absence de tout événement pendant une période de temps spécifiée peut être interprétée comme aucune activité de l'utilisateur – Ironluca

+0

Je ne peux pas modifier l'interface utilisateur existante en raison d'une demande d'interrogation. Comme je le dis dans la question je dois configurer l'URL de mise en commun – Michael