Délai d'expiration de Session dans le site web.XML
j'essaie de comprendre le véritable but de la configuration de session dans le Web.xml d'expiration de la session.
<!-- Session Configuration -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
permettez-moi maintenant de vous parler de ma question.
mon application importe/télécharge A.le fichier txt, qui prendra sûrement plus d'une heure, puisqu'il y a des millions de documents à importer. Mais la séance se termine après 1 heure, bien que mon application importe toujours cela .fichier txt qui est en cours. Une telle application ne doit pas être à l'arrêt car l'application fait une tâche dans l'arrière-plan.
12 réponses
pour définir une session-timeout qui n'expire jamais n'est pas souhaitable parce que vous seriez fiable sur l'utilisateur d'appuyer sur le bouton de déconnexion chaque fois qu'il est terminé pour empêcher votre serveur de trop de charge (en fonction de la quantité d'utilisateurs et le matériel). De plus il y a quelques problèmes de sécurité que vous pourriez rencontrer, vous préférez éviter.
la raison pour laquelle la session est invalidée alors que le serveur travaille encore sur une tâche est qu'il n'y a pas communication entre le côté client (navigateur de l'utilisateur) et le côté serveur via, par exemple, une requête http. Par conséquent, le serveur ne peut pas connaître l'état de l'utilisateur, pense qu'il tourne au ralenti et invalide la session après l'heure définie dans votre web.xml
.
Pour contourner cela, vous avez plusieurs possibilités:
- on pourrait ping back-end et pendant que la tâche est en cours d'exécution pour toucher la session et l'empêcher d'être expiré
- augmente le
<session-timeout>
à l'intérieur du serveur mais je ne recommande pas ce - exécutez votre tâche dans un thread dédié qui touche (étend) la session tout en travaillant ou informe l'utilisateur lorsque le thread est terminé
une question similaire a été posée, peut-être Pouvez-vous adapter certaines parties de cette solution dans votre projet. Regardez ce .
Espérons que cette aide, amusez-vous!
<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 le fil à compléter.
envoie des requêtes Http AJAX au serveur périodiquement (disons une fois toutes les 60 secondes) par javascript pour maintenir la session avec le serveur jusqu'à ce que le téléchargement de fichier soit terminé.
Hacky:
vous pouvez augmenter le temps d'arrêt programmatique de la session quand un grand up-/download est attendu.
session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)
Lorsque le processus se termine, vous pouvez définir le délai d'attente par défaut.
mais.. lorsque vous êtes sur Java EE, et que le téléchargement ne prend pas une heure complète, la meilleure façon est d'exécuter les tâches asynchrones (via JMS par exemple).
<session-config>
<session-timeout>-1</session-timeout>
</session-config>
dans le code ci-dessus "60" stands for the minutes.
la session expirera après 60 minutes.
donc si vous voulez plus de temps. Par Exemple -1
qui est décrit votre session n'expire jamais.
le docs dit:
l'élément session-timeout définit l'intervalle de temps de session par défaut pour toutes les sessions créées dans cette application web. Le délai spécifié doit être exprimée en un nombre entier de minutes. Si le délai est de 0 ou moins, le conteneur assure que le comportement par défaut des sessions n'est jamais de temporiser. Si cet élément n'est pas spécifié, le conteneur doit définir son délai par défaut.
vous pouvez voir beaucoup d'options comme réponse à votre question, cependant vous pouvez utiliser" -1 " où la session n'expire jamais. Puisque vous ne savez pas combien de temps il faudra pour le fil à compléter. Par exemple:
<session-config>
<session-timeout>-1</session-timeout>
</session-config>
Ou si vous ne voulez pas un délai d'attente qui se passe dans un but:
<session-config>
<session-timeout>0</session-timeout>
</session-config>
une Autre option pourrait être d'augmenter le nombre de 1000, etc, etc, bla, bla, bla.
Mais si vous voulez vraiment arrêter et vous considérer qui est inutile pour votre demande de forcer l'utilisateur à se déconnecter, il suffit d'ajouter un bouton de déconnexion et l'utilisateur de décider quand partir.
voici ce que vous pouvez faire pour résoudre le problème si vous n'avez pas besoin de forcer à se déconnecter, et dans vous chargez des fichiers qui pourraient prendre le temps de base sur le serveur et votre vitesse de l'ordinateur et la taille du fichier.
<!-- sets the default session timeout to 60 minutes. -->
<!-- <session-config>
<session-timeout>60</session-timeout>
</session-config> -->
il suffit de le commenter ou supprimé c'est tout! Tan tararantan, tan tan tan!
vous pouvez déclarer le temps de deux façons pour ce problème..
1) soit donner trop de temps que votre lecture de dossier est complète dans l'intervalle.
<session-config>
<session-timeout> 1000 </session-timeout>
</session-config>
2)déclarez le temps qui n'expire jamais votre session.
<session-config>
<session-timeout>-1</session-timeout>
</session-config>
une autre option que je recommande est de créer une demande distincte qui est apatride et qui prendrait le gros dossier. Sur votre application principale, ouvrez une nouvelle fenêtre ou iframe qui acceptera le fichier et l'enverra par cette fenêtre, puis masquez la fenêtre ou iframe une fois que le téléchargement a commencé en utilisant Javascript.
Si vous ne voulez pas un délai d'attente qui se passe dans un but:
<session-config>
<session-timeout>0</session-timeout>
</session-config>
Devrait entraîner aucun délai d'attente -> infini
vous devriez envisager de diviser le gros fichier en morceaux et compter sur les capacités de filetage multi pour traiter plus d'un fichier à la fois OU laissez l'ensemble du processus exécuter comme une tâche de fond en utilisant TimerTask et écrivez une autre requête pour connaître l'état de celui-ci forme le navigateur, y compris une barre de progression peut être affiché si vous pouvez connaître le temps de processus d'un fichier ou d'un enregistrement.
habituellement, la session n'expire pas lorsque le traitement de la demande est en cours. Je pense qu'il y a une LB ou quelque chose entre les deux qui lit tout le fichier et ensuite invoque le conteneur web.
cela pourrait causer un retard qui conduit à l'expiration de la session.