web-dev-qa-db-fra.com

Comment définir dynamiquement le délai d'expiration de la session dans les applications Web Java?

Je dois donner à mon utilisateur une interface Web pour modifier l'intervalle de temporisation de la session. Ainsi, différentes installations de l'application Web pourraient avoir des délais d'expiration différents pour leurs sessions, mais leur web.xml Ne peut pas être différent.

Existe-t-il un moyen de définir le délai d'expiration de la session par programmation, afin que je puisse utiliser, par exemple, ServletContextListener.contextInitialized() pour lire l'intervalle configuré et le définir au démarrage de l'application?

Merci beaucoup.

43
Jonathas Carrijo

Au lieu d'utiliser un ServletContextListener, utilisez un HttpSessionListener .

Dans la méthode sessionCreated() , vous pouvez définir le délai d'expiration de la session par programme:

public class MyHttpSessionListener implements HttpSessionListener {

  public void sessionCreated(HttpSessionEvent event){
      event.getSession().setMaxInactiveInterval(15 * 60); // in seconds
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

Et n'oubliez pas de définir l'écouteur dans le descripteur de déploiement :

<webapp>
...      
  <listener>                                  
    <listener-class>com.example.MyHttpSessionListener</listener-class>
  </listener>
</webapp>

(ou depuis la version 3.0 de Servlet, vous pouvez utiliser @WebListener annotation à la place).


Néanmoins, je recommanderais de créer différents fichiers web.xml pour chaque application et de définir le délai d'expiration de la session:

<webapp>
...
  <session-config>
    <session-timeout>15</session-timeout> <!-- in minutes -->
  </session-config>
</webapp>
68
Michael

Existe-t-il un moyen de définir le délai d'expiration de la session par programme

Il existe essentiellement trois façons de définir la valeur du délai d'expiration de la session:

  • en utilisant le session-timeout dans le fichier web.xml standard ~ ou ~
  • en l'absence de cet élément, en obtenant la valeur par défaut du serveur session-timeout (et donc en la configurant au niveau du serveur) ~ ou ~
  • par programme en utilisant la méthode HttpSession. setMaxInactiveInterval(int seconds) dans votre servlet ou JSP.

Mais notez que la dernière option définit la valeur de délai d'attente pour la session en cours , ce n'est pas un paramètre global.

33
Pascal Thivent

Comme un autre répondeur l'a dit, vous pouvez modifier un écouteur de session. Mais vous pouvez le changer directement dans votre servlet, par exemple.

getRequest().getSession().setMaxInactiveInterval(123);
1
Topera
Je dois donner à mon utilisateur une interface Web pour modifier l'intervalle de temporisation de la session. Ainsi, différentes installations de l'application Web pourraient avoir des délais d'expiration différents pour leurs sessions, mais leur web.xml ne peut pas être différent.

votre question est simple, vous avez besoin que l'intervalle de temporisation de la session soit configurable au moment de l'exécution et la configuration doit être effectuée via l'interface Web et il ne devrait pas y avoir de surcharge de redémarrage du serveur.

J'étends la réponse de Michaels pour répondre à votre question.

Logique: Vous devez stocker la valeur configurée dans le fichier .properties ou dans la base de données. Au démarrage du serveur, lisez cette valeur stockée et copiez-la dans une variable, utilisez-la jusqu'à ce que le serveur soit UP. Comme la configuration est également mise à jour, la variable de mise à jour. C'est ça.

Expaination

Dans la classe MyHttpSessionListener 1. créez une variable statique avec le nom globalSessionTimeoutInterval.

  1. créer un bloc statique (exécuté uniquement pour la première fois que la classe est accédée) et lire la valeur de délai d'expiration du fichier config.properties et définir la valeur sur la variable globalSessionTimeoutInterval.

  2. Utilisez maintenant cette valeur pour définir maxInactiveInterval

  3. Maintenant partie Web, c'est-à-dire la page de configuration Admin

    une. Copiez la valeur configurée dans la variable statique globalSessionTimeoutInterval.

    b. Écrivez la même valeur dans le fichier config.properties. (considérez que le serveur est redémarré alors globalSessionTimeoutInterval sera chargé avec la valeur présente dans le fichier config.properties)

  4. Fichier .properties alternatif OR le stocker dans la base de données. À vous de choisir.

Code logique pour y parvenir

public class MyHttpSessionListener implements HttpSessionListener 
{
  public static Integer globalSessionTimeoutInterval = null;

  static
  {
      globalSessionTimeoutInterval =  Read value from .properties file or database;
  }
  public void sessionCreated(HttpSessionEvent event)
  {
      event.getSession().setMaxInactiveInterval(globalSessionTimeoutInterval);
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

Et dans votre contrôleur de configuration ou servlet de configuration

String valueReceived = request.getParameter(timeoutValue);
if(valueReceived  != null)
{
    MyHttpSessionListener.globalSessionTimeoutInterval = Integer.parseInt(timeoutValue);
          //Store valueReceived to config.properties file or database
}
0