package com.jiuqi.lbsinterface.ws.server; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import com.jiuqi.lbsinterface.bean.UserBean; import com.jiuqi.lbsinterface.exception.LoginException; public final class Session { private final static Session dsession = new Session(); // /** * session正常失效时间 */ private final static long SessionOutTime = 100 * 60 * 1000;// 30分钟 /** * session最小失效时间,当服务器session缓存量达到系统的90%时,以此时间消耗session * * @see 未实现 */ private final static long SessionMinOutTime = 10 * 60000;// 10分钟 private final static int maxSessionNumber = 10000;// session上线10000。 // private final static ThreadLocal<Session> local = new ThreadLocal<Session>(); private final static Object LOCK = new Object(); private static Thread DaemonThread; // static { // initThread(); // } private synchronized static void initThread() { if (null == DaemonThread || DaemonThread.isInterrupted()) { DaemonThread = new Thread(new Runnable() { private final List<String> removeList = new ArrayList<String>(); private final int waitTime = 60000; private final int level = (int) (SessionMinOutTime / waitTime); private int time = 0; @Override public void run() { while (true) { synchronized (LOCK) { try { LOCK.wait(waitTime); } catch (InterruptedException e) { continue; } } if (time++ % level == 0) { synchronized (sessionMap) { for (Session s : sessionMap.values()) { if (System.currentTimeMillis() >= s.lastHaveTime + SessionOutTime) { removeList.add(s.getSessionID()); } } } } synchronized (removeList) { int size = removeList.size(); for (int i = size - 1; i >= 0; i--) { String key = removeList.remove(i); if (null != key) { synchronized (sessionMap) { sessionMap.remove(key); } } } } } } }); DaemonThread.setDaemon(true); DaemonThread.start(); } } private final static Map<String, Session> sessionMap = Collections .synchronizedMap(new HashMap<String, Session>());// new Coll<String, // Session>(); private final String sessionID; // private String requestIP; private String remortIP; private UserBean user; private Object httpServletRequest; private long lastHaveTime; private final Map<String, Object> data = new HashMap<String, Object>(); private Session() { // sessionID = UUID.randomUUID().toString(); // lastHaveTime = System.currentTimeMillis(); // initThread(); this(UUID.randomUUID().toString()); } private Session(String sessionID) { if (sessionMap.size() >= maxSessionNumber) { throw new SystemBusyException("超过session并发上线"); } synchronized (sessionMap) { if (sessionMap.containsKey(sessionID)) { throw new SessionRepeatStructureException(sessionID); } sessionMap.put(sessionID, this); } this.sessionID = sessionID; lastHaveTime = System.currentTimeMillis(); initThread(); } // javax.servlet.http.HttpServletRequest public static Session newSession(Object httpServletRequest, String requestIP) throws LoginException { try { Class<?> request = Class.forName( "javax.servlet.http.HttpServletRequest", true, Thread .currentThread().getContextClassLoader()); if (httpServletRequest.getClass().isAssignableFrom(request)) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误"); } } catch (ClassNotFoundException e) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误", e); } Session session = new Session(); session.httpServletRequest = httpServletRequest; session.remortIP = requestIP; // return putSession(session); return session; } // javax.servlet.http.HttpServletRequest public static Session newSession(Object httpServletRequest, String requestIP, String sessionID) throws LoginException { try { Class<?> request = Class.forName( "javax.servlet.http.HttpServletRequest", true, Thread .currentThread().getContextClassLoader()); if (httpServletRequest.getClass().isAssignableFrom(request)) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误"); } } catch (ClassNotFoundException e) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误", e); } Session session = new Session(sessionID); session.httpServletRequest = httpServletRequest; session.remortIP = requestIP; // return putSession(session); return session; } public static Session newSession(String requestIP) throws LoginException { Session session = new Session(); session.httpServletRequest = null; session.remortIP = requestIP; // return putSession(session); return session; } public static Session newSession() throws LoginException { Session session = new Session(); session.httpServletRequest = null; session.remortIP = null; // return putSession(session); return session; } public static Session getSession(String sessionID) throws LoginException { if(null != dsession){ return dsession; } if (null == sessionID || "".equals(sessionID.trim())) { return null; } Session session = null; synchronized (sessionMap) { if (null != sessionID) session = sessionMap.get(sessionID); } if (null == session) { StringBuffer s = new StringBuffer("(当前session个数:" + sessionMap.size() + ")"); s.append(" \n "); for (Session se : sessionMap.values()) { s.append(se.getSessionID()); s.append(" "); } System.out.println(s.toString()); throw new LoginException("您的登录信息已过期,请重新登录!" + s.toString()); } session.lastHaveTime = System.currentTimeMillis(); return session; } public static Session vali(String sessionID) throws LoginException { return getSession(sessionID); } public static Session loginOut(String sessionID) { synchronized (sessionMap) { return sessionMap.remove(sessionID); } } // public static void setThread(Session session) { local.set(session); } public static void removeThread() { local.remove(); } public static Session getThread() { return local.get(); } // // private static Session putSession(Session session) { // sessionMap.put(session.sessionID, session); // return session; // } // public String getRemortIP() { return remortIP; } public void setRemortIP(String remortIP) { this.remortIP = remortIP; } public UserBean getUser() { return user; } public void setUser(UserBean user) { this.user = user; } public Object getHttpServletRequest() { return httpServletRequest; } public void setHttpServletRequest(Object httpServletRequest) { this.httpServletRequest = httpServletRequest; } public String getSessionID() { return sessionID; } public Session put(String key, Object value) { data.put(key, value); return this; } public Object get(String key) { return data.get(key); } }