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.
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>
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:
session-timeout
dans le fichier web.xml
standard ~ ou ~session-timeout
(et donc en la configurant au niveau du serveur) ~ ou ~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.
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);
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.
Dans la classe MyHttpSessionListener 1. créez une variable statique avec le nom globalSessionTimeoutInterval.
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.
Utilisez maintenant cette valeur pour définir maxInactiveInterval
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)
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
}