fs-danaus
2023-06-26 2e5389660d216dabf6ebee15e7a3fa6eab73d01d
src/com/yc/action/login/LoginAction.java
@@ -17,6 +17,7 @@
import com.yc.exception.CallBackMessage;
import com.yc.factory.FactoryBean;
import com.yc.factory.InitSystem;
import com.yc.im.util.RedisSocket;
import com.yc.jpush.JpushAction;
import com.yc.listener.SessionListener;
import com.yc.multiData.MultiDataSource;
@@ -25,6 +26,7 @@
import com.yc.sdk.WebSocketMessage.action.WebSocketMessageServer;
import com.yc.sdk.WebSocketMessage.entity.MessageInfo;
import com.yc.sdk.WebSocketMessage.entity.MessageType;
import com.yc.sdk.WebSocketMessage.entity.WsMessageUserEntity;
import com.yc.sdk.gaodemap.action.GdMapServiceInit;
import com.yc.sdk.gaodemap.api.GdMapService;
import com.yc.sdk.gaodemap.entity.GdErrorException;
@@ -47,6 +49,7 @@
import com.yc.utils.*;
import eu.bitwalker.useragentutils.UserAgent;
import me.chanjar.weixin.common.util.http.URIUtil;
import okio.Source;
import org.apache.commons.lang.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
@@ -61,7 +64,6 @@
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -459,9 +461,13 @@
                        printJson(response, callBackMessage.sendErrorMessage(error,-1005));
                        return null;
                    }
                }else{
                    this.singleAccount(isApp ? "2" : "1", dbId, userAccount, request);
                }
            }
            }else {
                //限制多设备登录
                this.singleAccount(isApp ? "2" : "1", dbId, userAccount, request);
            }
            }
            processLoginUserToSessionV2(ip, dbId, request, userAccount);
            //-------------------------------
@@ -627,34 +633,30 @@
private void singleAccount(String userFromType,String dbId, UserAccountEntity userAccount, HttpServletRequest request){
        HttpSession session = request.getSession();
    List<OnlineUserEntity> onLineUser = SessionListener.getOnLineUser(request, dbId);//tomcat集群是采用会话复制,所以每个tomcat里的会话信息是一样,取到同一数据源所有会话,从中取到当前用户的会话
     OnlineUserEntity  perUserEntity=null;//前一个会话
    if(onLineUser!=null&&onLineUser.size()>0) {
        for(OnlineUserEntity entity:onLineUser){
                if(entity.getUserCode().equalsIgnoreCase(userAccount.getUserCode())
                        &&userFromType.equalsIgnoreCase(entity.getLoginType()+"")//指明是PC,还是APP端
                        &&!session.getId().equalsIgnoreCase(entity.getSessionId())//排除当前的会话,取同账号的之前会话
                ){
                    perUserEntity=entity;
                    break;
                //只要会话存在,发webSocket回到登录界面
                //---通知webscoket
                MessageInfo messageInfo = new MessageInfo();
                messageInfo.setDbId(Integer.parseInt(dbId));
                messageInfo.setMsgType(MessageType.RETURN_LOGIN_PAGE);
                messageInfo.setUserFromType(userFromType);
                messageInfo.setUserCode(entity.getUserCode());
                messageInfo.setSessionId(entity.getSessionId());
                if(userFromType.equalsIgnoreCase("1")) {//PC端
                    messageInfo.setMsg("您的账号已在其他地方登录");
                }else{
                    messageInfo.setMsg("您的账号已在其他设备登录");
                }
                WebSocketMessageServer.publishMessageToRedis(messageInfo);
            }
        }
    }
        if(perUserEntity!=null){
                //只要会话存在,发webSocket回到登录界面
            //---通知webscoket
            MessageInfo messageInfo = new MessageInfo();
            messageInfo.setDbId(Integer.parseInt(dbId));
            messageInfo.setMsgType(MessageType.ONLY_ONE_ACCOUNT);
            messageInfo.setUserFromType(userFromType);
            messageInfo.setUserCode(perUserEntity.getUserCode());
            messageInfo.setSessionId(perUserEntity.getSessionId());
            if(userFromType.equalsIgnoreCase("1")) {//PC端
                messageInfo.setMsg("您的账号已在其他地方登录");
            }else{
                messageInfo.setMsg("您的账号已在其他设备登录");
            }
            WebSocketMessageServer.publishMessageToRedis(messageInfo);
        }
}
    private String genToken(String pwd, String usercode, int dbid) {
@@ -795,8 +797,8 @@
            } finally{
                SpObserver.setDBtoInstance();
            }
        if (dataSourceMap.isLoginOnceForOneUserCode()&& org.apache.commons.lang3.StringUtils.isNotBlank(userEntity.getUniqueIdentifier()) &&request.getParameter("isApp") != null || request.getAttribute("isApp") != null) {
            //是否启用限制多设备登录也需要记录
       // if (dataSourceMap.isLoginOnceForOneUserCode() &&request.getAttribute("loginByCode") != null) {
            //启用限制多设备登录,且通过短信二次验证登录
            try {
                SpObserver.setDBtoDemo();
                userEntity.setTelePhone(userAccount.getApp_userCode());//手机号
@@ -804,7 +806,7 @@
            } finally {
                SpObserver.setDBtoInstance();
            }
        }
       // }
        return true;
    }
@@ -1431,8 +1433,36 @@
            } catch (Exception ex) {
                this.print2(response, ex.getMessage(), request.getParameter("redirect"), isApp);
            }
            if (isApp) {
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_APP);//app 类型
                //判断当前登录设备是否与最新一次登录设备是一样,不一样需要返回给前端,输出短信进行验证登录
            } else {
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_WEB);//web 类型
            }
            final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbid);
            //---------------------------------
            if(dataSourceMap.isLoginOnceForOneUserCode()) {
                //限制多设备登录
                this.singleAccount(isApp ? "2" : "1", dbid, userAccount, request);
            }
            // 设置权限
            processLoginUserToSessionV2(ip, dbid, request, userAccount);
            //把新会话id替换websocket中对应用户的会话id,
            //--同一用户重新连接,如果存在已有会话是打开状态,则删除这个会话,启用新会话
            if(WebSocketMessageServer.getOnlineUserList()!=null&&WebSocketMessageServer.getOnlineUserList().size()>0) {
                String key = RedisSocket.CHANEL_WS_MESSAGES + ":" + dbid + ":1:" + usercode + ":";
                for (Map.Entry<String, WsMessageUserEntity> entry : WebSocketMessageServer.getOnlineUserList().entrySet()) {
                    if (entry.getKey().contains(key)) {
                        if (entry.getValue().getSession().isOpen()) {
                            WsMessageUserEntity wsMessageUser= entry.getValue();
                            wsMessageUser.setSessionId(session.getId());
                            WebSocketMessageServer.getOnlineUserList().put(key+session.getId(),wsMessageUser);
                            break;
                        }
                    }
                }
            }
            callBackMessage.sendSuccessMessage("登录成功");
            this.printJson(response, callBackMessage.toString());
            return null;