⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sessionmanager.java

📁 《j2ee开发全程实录》随书源码
💻 JAVA
字号:
package com.cownew.PIS.framework.server.sessionMgr;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

import com.cownew.PIS.framework.server.helper.ServerConfig;
import com.cownew.ctk.common.DateUtils;
import com.cownew.ctk.common.RandomGUID;

/**
 * 会话管理器
 * @author 杨中科
 *
 */
public class SessionManager
{
	private static SessionManager instance = null;	
	
	//sessionId为key,ServerUserContext为value
	private Map sessionMap = Collections.synchronizedMap(new HashMap());
	
	//sessionId为key,会话自上次活动以来的时间(分钟)为value
	private Map sessionActiveMap = Collections.synchronizedMap(new HashMap());

	private SessionManager()
	{
		super();
		//要设置成后台线程,否则会造成服务器无法正常关闭
		Timer sessionClearTimer = new Timer(true);
		int oneMin = DateUtils.ONE_MINUTE;
		//1分钟以后开始,每隔一分钟探测一次
		sessionClearTimer.schedule(new SessionCleanerTimerTask(),oneMin,oneMin);
	}

	public static SessionManager getInstance()
	{
		if (instance == null)
		{
			instance = new SessionManager();
		}
		return instance;
	}

	/**
	 * 根据会话id得到用户上下文
	 * @param sessionId
	 * @return
	 */
	public ServerUserContext getServerUserContext(String sessionId)
	{
		return (ServerUserContext) sessionMap.get(sessionId);
	}	

	/**
	 * 得到所有会话id的集合
	 * @return
	 */
	public Set getSessionIdSet()
	{
		return Collections.unmodifiableSet(sessionMap.entrySet());
	}
	
	/**
	 * sessionId是否合法(存在并且没有超时)
	 * @param sessionId
	 * @return
	 */
	public boolean isValid(String sessionId)
	{
		return sessionMap.containsKey(sessionId);
	}

	/**
	 * 清除session
	 * @param object
	 */
	public void removeSession(String sessionId)
	{
		sessionMap.remove(sessionId);
	}

	/**
	 * 清除所有session
	 *
	 */
	public void removeAll()
	{
		sessionMap.clear();

	}

	/**
	 * 根据帐套名请求一个会话Id
	 * @param acName
	 * @return
	 */
	public String requestSessionId(String acName)
	{
		String sessionId = new RandomGUID().toString();

		ServerUserContext ctx = new ServerUserContext();
		ctx.setACName(acName);
		ctx.setSessionId(sessionId);

		sessionMap.put(sessionId, ctx);
		sessionVisit(sessionId);
		return sessionId;
	}

	/**
	 * session产生活动了
	 * @param sessionId
	 */
	public void sessionVisit(String sessionId)
	{
		if (!sessionMap.containsKey(sessionId))
		{
			return;
		}
		sessionActiveMap.put(sessionId, new Integer(0));
	}	
	
	protected class SessionCleanerTimerTask extends TimerTask
	{
		private int timeOut = ServerConfig.getInstance().getSessionTimeOut();

		public void run()
		{
			Set idSet = sessionActiveMap.keySet();
			Iterator idIt = idSet.iterator();

			// 已经失效的session的id列表
			List invalidIdList = new ArrayList();
			while (idIt.hasNext())
			{
				String id = (String) idIt.next();

				// 自上次访问以来的时长
				Integer lastSpan = (Integer) sessionActiveMap.get(id);
				if (lastSpan.intValue() > timeOut)
				{
					invalidIdList.add(id);
				}
				sessionActiveMap.put(id, new Integer(lastSpan.intValue() + 1));
			}
			for (int i = 0, n = invalidIdList.size(); i < n; i++)
			{
				String id = (String) invalidIdList.get(i);
				removeSession(id);
				sessionActiveMap.remove(id);
			}
		}

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -