SessionTimeout: web.xml vs session.maxInactiveInterval()
j'essaie de chronométrer un HttpSession en Java. Mon container est WebLogic.
Actuellement, nous avons le temps d'arrêt de la session dans le web .fichier xml , comme ceci
<session-config>
<session-timeout>15</session-timeout>
</session-config>
maintenant, on me dit que cela va mettre fin à la session (ou est-ce Toutes les sessions?) à la 15ème minute d'utilisation, quelle que soit leur activité.
je me demande si cette approche est la bonne, ou devrais-je programmatiquement fixer la limite de temps d'inactivité par
session.setMaxInactiveInterval(15 * 60); //15 minutes
Je ne veux pas laisser tomber toutes les séances à 15 minutes, seulement celles qui ont été inactives pendant 15 minutes.
ces méthodes Sont-elles équivalentes? Devrais-je favoriser le web .xml config?
3 réponses
maintenant, on me dit que cela va mettre fin à la session (ou est-ce Toutes les sessions?) à la 15ème minute d'utilisation, quelle que soit leur activité .
ici faux . Il va simplement tuer la session lorsque le client associé (webbrowser) n'a pas accédé au site web depuis plus de 15 minutes. L'activité compte certainement, exactement comme vous vous y attendiez au départ, vu votre tentative de résoudre ce problème.
le HttpSession#setMaxInactiveInterval()
ne change pas beaucoup ici d'ailleurs. Il fait exactement la même chose que <session-timeout>
dans web.xml
, avec la seule différence que vous pouvez le modifier/régler programmatiquement pendant l'exécution. Le changement n'affecte en fait que l'instance de la session courante, et non pas globalement (sinon cela aurait été une méthode static
).
pour jouer et faire l'expérience de ce vous-même , essayez de mettre <session-timeout>
à 1 minute et créez un HttpSessionListener
comme suit:
@WebListener
public class HttpSessionChecker implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
}
}
(si vous N'êtes pas encore sur Servlet 3.0 et ne pouvez donc pas utiliser @WebListener
, inscrivez-vous dans web.xml
comme suit) :
<listener>
<listener-class>com.example.HttpSessionChecker</listener-class>
</listener>
notez que le servletcontainer ne détruira pas immédiatement les sessions après exactement la valeur de temporisation. Il s'agit d'une tâche de fond qui s'exécute à certains intervalles (par exemple 5~15 minutes en fonction de la charge et de la marque/type du servletcontainer). Ne soyez donc pas surpris lorsque vous ne voyez pas la ligne destroyed
dans la console immédiatement après exactement une minute d'inactivité. Cependant, lorsque vous lancez une requête HTTP sur une session timed-out-but-not-destroyed-yet, elle sera détruite immédiatement.
voir aussi:
maintenant, on me dit que cela va mettre fin à la session (ou est-ce Toutes les sessions?) à la 15ème minute d'utilisation, quelle que soit leur activité.
Non, ce n'est pas vrai. Le session-timeout
configure un temps d'arrêt par session en cas d'inactivité.
ces méthodes Sont-elles équivalentes? Devrais-je favoriser le web.xml de config?
Le paramètre dans le web.xml est global, c' s'applique à toutes les séances d'un contexte donné. Par programmation, vous pouvez modifier ce pour une session particulière.
s'il vous Plaît vérifier seession délai d'attente en dessous du pseudo-code
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"`enter code here`
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanenter code herece"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>AccountWeb</display-name>
<listener>
<description>[Re]configures log4j</description>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<description>How often to check for changes in configfile (ms)</description>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<context-param>
<description>Avoid setting system property as there might be several apps in same VM</description>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
<listener>
<description>The listener that will start Account</description>
<display-name>AccountInitialiser</display-name>
<listener-class>com.te.account.AccountInitializer</listener-class>
</listener>
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
<load-on-startup>200</load-on-startup>
</servlet>
<servlet>
<display-name>Axis Admin Servlet</display-name>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- <resource-ref>
<description>The queue used to publish logging events</description>
<res-ref-name>jms/LoggingAppenderQueue</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<description>The connection factory for the logging appender queue</description>
<res-ref-name>jms/LoggingAppenderQueueConnFactory</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref> -->
<resource-ref>
<description>
</description>
<res-ref-name>jdbc/AccountDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>