package com.jqmobile.core.server.rmi; 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.jqmobile.core.server.Application; import com.jqmobile.core.server.Application.RemoteUser; public class RmiLoginImpl implements IRmiLogin{ // private final static Map<String, User> map = Collections.synchronizedMap(new HashMap<String, User>()); // private final static List<User> list = new ArrayList<User>(); final static Map<String, User> sessionMap = Collections.synchronizedMap(new HashMap<String, User>()); private final static List<HandleUser> handles = new ArrayList<HandleUser>(); // static{ // IXMLNode rmi = Application.getApplication().getRmiProperties(); //// <rmi open="true"> //// <users> //// <user username="root" password="123455" maxConnectionCount="200"> //// 允许访问的ip,不设置表示不限制 //// <ip>10.2.12.2</ip> //// </user> //// </users> //// <remote> //// <id>1</id> //// <ip>127.0.0.1</ip> //// <port>9700</port> //// <username>root</username> //// <password>123455</password> //// </remote> //// </rmi> // List<IXMLNode> users = rmi.getChilds("users"); // if(!users.isEmpty()){ // List<IXMLNode> us = users.get(0).getChilds("user"); // User u; // for(IXMLNode user : us){ //// Map<String, String> atts = user.getAttributes(); // u = new User(); // // // String username = user.getAttribute("username"); // if(null != username) u.setUsername(username); // // // String password = user.getAttribute("password"); // if(null != password) u.setPassword(password); // // // String maxConnectionCount = user.getAttribute("maxConnectionCount"); // if(null != maxConnectionCount) u.setMaxConnectionCount(Integer.parseInt(maxConnectionCount)); // // // List<IXMLNode> ips = user.getChilds("ip"); // if(!ips.isEmpty()){ // List<String> list = new ArrayList<String>(); // for(IXMLNode ip : ips){ // list.add(ip.getText()); // } // u.setApprovedIPs(list); // } // } // } // } static class User extends Application.RemoteUser{ // private String username; // private String password; // private Integer maxConnection;//允许最大连接数 private List<UserConnInfo> connInfos;//当前连接信息 // private List<String> approvedIPs;//允许IP列表 private int connCount=0; // private String session; public User(){ super(); } public User(RemoteUser u) { setMaxConnectionCount(u.getMaxConnectionCount()); setPassword(u.getPassword()); setUsername(u.getUsername()); lockIps.addAll(u.getLockIps()); } // public String getUsername() { // return username; // } // public void setUsername(String username) { // this.username = username; // } // public String getPassword() { // return password; // } // public void setPassword(String password) { // this.password = password; // } // public Integer getMaxConnection() { // return maxConnection; // } // public void setMaxConnection(Integer maxConnection) { // this.maxConnection = maxConnection; // } public List<UserConnInfo> getConnInfos() { return connInfos; } public void setConnInfos(List<UserConnInfo> connInfos) { this.connInfos = connInfos; } public String getSession() { return session; } public void setSession(String session) { this.session = session; } // public List<String> getApprovedIPs() { // return approvedIPs; // } // public void setApprovedIPs(List<String> approvedIPs) { // this.approvedIPs = approvedIPs; // } public void addConn() throws RmiException { if(null != getMaxConnectionCount() && connCount >= getMaxConnectionCount()){ throw new RmiException(RmiException.RMI_AboveMaxConn_Error); } connCount++; } public void subConn() { connCount--; } } static class UserConnInfo{ private long beginTime; private long requestCount; private String clientIp; public long getBeginTime() { return beginTime; } public void setBeginTime(long beginTime) { this.beginTime = beginTime; } public long getRequestCount() { return requestCount; } public void setRequestCount(long requestCount) { this.requestCount = requestCount; } public String getClientIp() { return clientIp; } public void setClientIp(String clientIp) { this.clientIp = clientIp; } } static class HandleUser{ private final User user; private final String ip; private final long time; public HandleUser(User user, String ip) { super(); this.user = user; this.ip = ip; this.time = System.currentTimeMillis(); } public User getUser() { return user; } public String getIp() { return ip; } public long getTime() { return time; } } // @Override public String login(String username, String password) throws RmiException { for(RemoteUser user : Application.getApplication().getRemoteUser()){ if(user.getUsername().equals(username)){ if(user.getPassword().equals(password)){ return login(user); } throw new RmiException(RmiException.RMI_Password_Error); } } throw new RmiException(RmiException.RMI_NotFoundUsername_Error); } private String login(RemoteUser u) throws RmiException { User user = new User(u); String ip = RmiUtils.getClientIp(); if(null != user.getLockIps() && !user.getLockIps().isEmpty() && !user.getLockIps().contains(ip)){ throw new RmiException(RmiException.RMI_RequestIP_Error); } synchronized (user) { if(null == user.getSession()){ user.setSession(UUID.randomUUID().toString()); } } sessionMap.put(user.getSession(),user); handles.add(new HandleUser(user, ip)); return user.getSession(); } }