Java设置session超时的三种方式及自定义session监听

1.web容器设置(以tomcat为例)

在tomcat\conf\web.xml中设置,tomcat默认session超时时间为30分钟,可以根据需要修改,负数或0为不限制session失效时间。

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

2.在工程的web.xml中设置

	<!-- 时间单位为分钟 -->
	<session-config>
		<session-timeout>15</session-timeout>
	</session-config>

3.通过java代码设置

    public void setMaxInactiveInterval(int interval);//时间单位为秒

三种方式的优先级为1<2<3

session 在tomcat重启后一般也不会失效,关闭浏览器后,session失效 。             

在一般系统中,也可能需要在session失效后做一些操作:
  (1)控制用户数,当session失效后,系统的在线用户数减少一个,控制用户数在一定范围内,确保系统的性能。
  (2)session失效,把用户对象移除,提示用户重新登录

那么如何在session失效后,进行一系列的操作呢?
  这里就需要用到监听器了,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序就可以了。
  监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法 ,自己可以继承这个类,然后分别实现。
  sessionCreated指在session创建时执行的方法
  sessionDestroyed指在session失效时执行的方法

以下以session失效移除用户对象为例:

session监听SessionListener 类

import com.csii.pe.accesscontrol.ResourceList;
import com.csii.pe.core.User;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;

public class SessionListener implements HttpSessionListener {
	private ResourceList resourceList = null;
	protected Log log = LogFactory.getLog(super.getClass());

	public void sessionCreated(HttpSessionEvent arg0) {
	}

	public void sessionDestroyed(HttpSessionEvent arg0) {
		try {
			HttpSession session = arg0.getSession();
			User user = (User) session.getAttribute("_USER");

			if (this.resourceList == null) {
				init(session);
			}

			if ((user != null) && (!(user.isLogout())))
				this.resourceList.remove(user.getUniqueId());
		} catch (Exception e) {
			this.log.error("_remove user", e);
		}
	}

	public void init(HttpSession session) {
		Enumeration en = session.getServletContext().getAttributeNames();

		while (en.hasMoreElements()) {
			String attribName = (String) en.nextElement();
			Object attrib = session.getServletContext().getAttribute(attribName);
			if (attrib instanceof WebApplicationContext) {
				WebApplicationContext wb = (WebApplicationContext) attrib;

				this.resourceList = ((ResourceList) wb.getBean("successUserRegistry"));
			}
		}
	}
}

监听器在web.xml中声明

	<listener>
		<listener-class>com.test.SessionListener</listener-class>
	</listener>

猜你喜欢

转载自blog.csdn.net/liuyongheng1991/article/details/81673801