package com.jqmobile.core.server.rmi2; import java.rmi.RemoteException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import com.jqmobile.core.server.Application; import com.jqmobile.core.server.Application.RemoteUser; import com.jqmobile.core.server.rmi.RmiException; import com.jqmobile.core.server.rmi.RmiUser; import com.jqmobile.core.utils.plain.DateUtils; import com.jqmobile.core.utils.timer.TimerTask; public class RmiSession implements IRmiLogin{ /** * session检查周期 * @usermodi qq:411051729 * 变更说明: */ private final static long SessionValiPeriod = 600000; private final static long MaxNoRequestTime = DateUtils.ONE_HOUR_TIME; private final static long MaxSessionTime = DateUtils.ONE_DATE_TIME; // private final static Map<String, RemoteUser> userMap = new HashMap<String, RemoteUser>(); private final static Map<String, UserTask> taskMap = Collections.synchronizedMap(new HashMap<String, UserTask>()); private final static Map<String, UserTask> sessionMap = Collections.synchronizedMap(new HashMap<String, UserTask>()); static{ List<RemoteUser> rUsers = Application.getApplication().getRemoteUser(); for(RemoteUser user : rUsers){ userMap.put(user.getUsername(), user); } } @Override public String login(RmiUser user) throws RemoteException { RemoteUser u = userMap.get(user.getUserName()); if(null == u){ throw new RmiException(RmiException.RMI_NotFoundUsername_Error); } if(!u.getPassword().equals(user.getPassword())){ throw new RmiException(RmiException.RMI_Password_Error); } synchronized (taskMap) { if(!taskMap.containsKey(user.getUserName())){ UserTask task = new UserTask(u); taskMap.put(user.getUserName(), task); sessionMap.put(task.getSession(), task); } } return taskMap.get(user.getUserName()).getSession(); } @Override public String login(String username, String password) throws RemoteException { RmiUser user = new RmiUser(); user.setUserName(username); user.setPassword(password); return login(user); } // /** * 获取session对应用户信息 * @param session * @return RemoteUser * @user modi qq:411051729 */ public static RemoteUser getSessionUser(String session){ final UserTask userTask = sessionMap.get(session); if(null == userTask){ return null; } userTask.f5(); return userTask.user; } /** * 校验session * <p>不更新session最后访问时间 * @param session * @return boolean 存在返回true * @user modi qq:411051729 */ public static boolean valiSession(String session){ return sessionMap.containsKey(session); } /** * 激活session连接 * @param session * @throws RmiException void * @user modi qq:411051729 */ public static void activateSessionConn(String session) throws RmiException{ final UserTask userTask = sessionMap.get(session); if(null == userTask){ throw new RmiException(RmiException.RMI_Session_Error); } userTask.f5(); userTask.addConn(); } /** * 释放session连接 * @param session * @throws RmiException void * @user modi qq:411051729 */ public static void returnSessionConn(String session) throws RmiException{ final UserTask userTask = sessionMap.get(session); if(null == userTask){ throw new RmiException(RmiException.RMI_Session_Error); } userTask.f5(); userTask.subConn(); } //=================== static class UserTask extends TimerTask<Void, Boolean>{ private final RemoteUser user; private final String session; private final long loginTime; private long lastHandlerTimer; private int connCount=0; public UserTask(RemoteUser user) { this(user,System.currentTimeMillis()); } public UserTask(RemoteUser user, long loginTime) { this(user, loginTime, UUID.randomUUID().toString()); } public UserTask(RemoteUser user, long loginTime, String session) { this.user = user; this.loginTime = loginTime; this.session = session; } public void addConn() throws RmiException{ synchronized (user) { if(null != user.getMaxConnectionCount() && user.getMaxConnectionCount()<connCount){ throw new RmiException(RmiException.RMI_AboveMaxConn_Error); } connCount++; } } public synchronized void subConn(){ connCount--; } public String getSession() { return session; } public void f5(){ lastHandlerTimer = System.currentTimeMillis(); } @Override protected Boolean doInBackground(Void... params) throws Throwable { if((System.currentTimeMillis()-loginTime)>MaxSessionTime){ return true; } if((System.currentTimeMillis()-lastHandlerTimer)>MaxNoRequestTime){ return true; } return false; } @Override protected void onPostExecute(Boolean result) { if(result){ synchronized (sessionMap) { sessionMap.remove(session); } synchronized (taskMap) { sessionMap.remove(user.getUsername()); } } } @Override protected long period() { return SessionValiPeriod; } } }