web-dev-qa-db-fra.com

Session TimeOut dans web.xml

J'essaie de comprendre l'objectif réel de la configuration de session dans Web.xml pour le délai d'expiration de session.

<!-- Session Configuration -->
<session-config>
        <session-timeout>60</session-timeout>
</session-config>

Maintenant, laissez-moi vous parler de ma question.

Mon application importe/télécharge un fichier .txt, ce qui devrait prendre plus d'une heure, car des millions d'enregistrements doivent être importés . Mais la session expire au bout d'une heure, bien que mon application l'importe toujours. fichier txt en cours de réalisation . Une telle application ne doit pas expirer car elle exécute une tâche en arrière-plan.

61
Vineet

Définir un délai de session qui n’expire jamais n’est pas souhaitable car vous seriez en mesure de convaincre l’utilisateur d’appuyer sur le bouton de déconnexion chaque fois qu’il a terminé pour éviter que votre serveur ne soit trop chargé (en fonction du nombre d’utilisateurs et du matériel). De plus, il y a certains problèmes de sécurité que vous pourriez rencontrer que vous préféreriez éviter. 

La raison pour laquelle la session est invalidée pendant que le serveur travaille toujours sur une tâche est qu’il n’ya aucune communication entre le côté client (navigateur de l’utilisateur) et le côté serveur, par ex. une requête http. Par conséquent, le serveur ne peut pas connaître l'état des utilisateurs, pense qu'il est inactif et invalide la session après l'heure définie dans votre web.xml

Pour contourner cela, vous avez plusieurs possibilités: 

  • Vous pouvez ping votre serveur pendant l'exécution de la tâche pour toucher la session et empêcher son expiration.
  • augmenter le <session-timeout> à l'intérieur du serveur mais je ne le recommanderais pas
  • exécutez votre tâche dans un thread dédié qui touche la session tout en travaillant ou informe l'utilisateur lorsque le thread est terminé 

Une question similaire a été posée, vous pouvez peut-être adapter une partie de cette solution à votre projet. Regardez cela

J'espère que ça aide, amusez-vous!

40
SimonSez
<session-config>
    <session-timeout>-1</session-timeout>
</session-config>

Vous pouvez utiliser "-1" lorsque la session n'expire jamais. Puisque vous ne savez pas combien de temps il faudra pour que le fil se termine.

34
user1262479

Envoyer AJAX Requêtes HTTP au serveur périodiquement (par exemple une fois toutes les 60 secondes) via JavaScript pour maintenir la session avec le serveur jusqu'à la fin du téléchargement du fichier.

9
user2039408

Façon piratée:

Vous pouvez augmenter le délai d'expiration de la session par programme lorsqu'un grand téléchargement/téléchargement est attendu.

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)

À la fin du processus, vous pouvez rétablir le délai par défaut.

Mais… lorsque vous utilisez Java EE et que le téléchargement ne prend pas une heure, le meilleur moyen était d'exécuter les tâches de manière asynchrone (via JMS, par exemple).

9
vhunsicker
<session-config>
        <session-timeout>-1</session-timeout>
</session-config>

Dans le code ci-dessus "60" stands for the minutes. La session expirera après le 60 minutes. Donc si vous voulez plus de temps. Par exemple, -1 décrit votre session n’expire jamais.

7

La documentation dit:

L'élément session-timeout définit l'intervalle de temporisation de session par défaut pour toutes les sessions créées dans cette application Web. Le délai d'attente spécifié doit être exprimé en un nombre entier de minutes. Si le délai d'attente est égal ou inférieur à 0, le conteneur veille à ce que le comportement par défaut des sessions ne soit jamais dépassé. Si cet élément n'est pas spécifié, le conteneur doit définir son délai d'expiration par défaut.

6
Rubens Mariuzzo

Vous pouvez voir de nombreuses options comme réponse à votre question, mais vous pouvez utiliser "-1" lorsque la session n’expire jamais. Puisque vous ne savez pas combien de temps il faudra pour que le fil se termine. Par exemple.:

   <session-config>
        <session-timeout>-1</session-timeout>
    </session-config>

Ou si vous ne voulez pas qu'un délai d'attente se produise pour une raison quelconque:

<session-config>
    <session-timeout>0</session-timeout>
</session-config>

Une autre option pourrait être d’augmenter le nombre à 1000, etc., etc., bla, bla, bla.

Toutefois, si vous souhaitez vraiment arrêter et considérez qu'il est inutile pour votre application de forcer l'utilisateur à se déconnecter, ajoutez simplement un bouton de déconnexion et l'utilisateur décidera quand le quitter.

Voici ce que vous pouvez faire pour résoudre le problème si vous n’avez pas besoin de forcer la déconnexion et si vous chargez des fichiers qui pourraient prendre du temps en fonction du serveur, de la vitesse de votre ordinateur et de la taille du fichier.

<!-- sets the default session timeout to 60 minutes. -->
   <!-- <session-config>
     <session-timeout>60</session-timeout>
   </session-config> -->

Il suffit de commenter ou supprimer c'est tout! Tan tararantan, bronzage!

5
S. Mayol

vous pouvez déclarer le temps de deux manières pour résoudre ce problème.

1) soit vous accordez trop de temps à la lecture du fichier entre-temps.

<session-config>
    <session-timeout> 1000 </session-timeout>
</session-config>

2) déclarer le temps qui n'expire jamais votre session.

<session-config>
    <session-timeout>-1</session-timeout>
</session-config>
3
Mitul Maheshwari

Une autre option que je recommanderais consiste à créer une application distincte, sans état, qui prendrait le fichier volumineux. Sur votre application principale, ouvrez une nouvelle fenêtre ou une iframe qui acceptera le fichier et l'enverra par cette fenêtre, puis masquerez la fenêtre ou l'iframe une fois que le téléchargement a commencé à utiliser Javascript.

1
Archimedes Trajano

Vous devriez envisager de scinder le fichier volumineux en gros morceaux et de vous fier aux capacités de threading multiples pour traiter plusieurs fichiers à la fois OU Laisser l'ensemble du processus s'exécuter en tâche de fond à l'aide de TimerTask et écrire une autre requête pour connaître l'état de celui-ci le navigateur, y compris une barre de progression, peut être affiché si vous pouvez connaître le temps de traitement d’un fichier ou d’un enregistrement.

0
Prashant

Si vous ne voulez pas qu'un délai d'attente se produise dans un but précis:

<session-config>
    <session-timeout>0</session-timeout>
</session-config>

Ne devrait aboutir à aucun délai d'expiration -> infini

0
Jeevan Patil