我正在尝试在Java中超时 HttpSession 。我的容器是WebLogic。
目前,我们在 web.xml 文件中设置了会话超时,就像这样
<session-config>
<session-timeout>15</session-timeout>
</session-config>
现在,我被告知这将在使用的第15分钟终止会话(或者是所有会话?),无论他们的活动如何。
我想知道这种方法是否正确,或者我应该以编程方式设置不活动的时间限制
session.setMaxInactiveInterval(15 * 60); //15 minutes
我不想在15分钟内放弃所有会话,只有那些在15分钟内处于非活动状态的会话。
这些方法是否相同?我应该支持 web.xml 配置吗?
答案 0 :(得分:117)
现在,我被告知这将在使用的第15分钟终止会话(或者是所有会话?),无论其活动。
错误。当关联的客户端(webbrowser)访问网站超过15分钟时,它将会终止会话。正如您最初预期的那样,活动肯定会计入您的解决方案。
顺便说一句,HttpSession#setMaxInactiveInterval()
在这里没有太大变化。它与<session-timeout>
中的web.xml
完全相同,唯一的区别是您可以在运行时以编程方式更改/设置它。顺便说一下,更改只影响当前会话实例,而不是全局(否则它将是static
方法)。
要四处游玩并体验您自己,请尝试将<session-timeout>
设置为1分钟并创建HttpSessionListener
,如下所示:
@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());
}
}
(如果您尚未使用Servlet 3.0,因此无法使用@WebListener
,请按以下方式在web.xml
中注册):
<listener>
<listener-class>com.example.HttpSessionChecker</listener-class>
</listener>
请注意,在完全超时值之后,servletcontainer不会立即销毁会话。这是一个后台工作,它以一定的间隔运行(例如5到15分钟,具体取决于负载和servletcontainer品牌/类型)。因此,如果在一分钟不活动后立即在控制台中看不到destroyed
行,请不要感到惊讶。但是,当您在超时但未被破坏的会话中触发HTTP请求时,它将立即被销毁。
答案 1 :(得分:11)
现在,我被告知这将在第15分钟内终止会话(或者是所有会话?),无论他们的活动如何。
不,那不是真的。如果不活动,session-timeout
会配置每个会话超时。
这些方法是否相同?我应该支持web.xml配置吗?
web.xml中的设置是全局的,它适用于给定上下文的所有会话。以编程方式,您可以为特定会话更改此设置。
答案 2 :(得分:-3)
请在以下伪代码中检查会话超时
<?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>