From 2e5389660d216dabf6ebee15e7a3fa6eab73d01d Mon Sep 17 00:00:00 2001
From: fs-danaus <danaus314@qq.com>
Date: 星期一, 26 六月 2023 10:13:32 +0800
Subject: [PATCH] 会话失效时websocket发送通知

---
 src/com/yc/action/login/LoginAction.java |   78 +++++++++++++++++++++++++++------------
 1 files changed, 54 insertions(+), 24 deletions(-)

diff --git a/src/com/yc/action/login/LoginAction.java b/src/com/yc/action/login/LoginAction.java
index 6cde251..dfdbb60 100644
--- a/src/com/yc/action/login/LoginAction.java
+++ b/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闆嗙兢鏄噰鐢ㄤ細璇濆鍒讹紝鎵�浠ユ瘡涓猼omcat閲岀殑浼氳瘽淇℃伅鏄竴鏍凤紝鍙栧埌鍚屼竴鏁版嵁婧愭墍鏈変細璇濓紝浠庝腑鍙栧埌褰撳墠鐢ㄦ埛鐨勪細璇�
-     OnlineUserEntity  perUserEntity=null;//鍓嶄竴涓細璇�
     if(onLineUser!=null&&onLineUser.size()>0) {
         for(OnlineUserEntity entity:onLineUser){
                 if(entity.getUserCode().equalsIgnoreCase(userAccount.getUserCode())
                         &&userFromType.equalsIgnoreCase(entity.getLoginType()+"")//鎸囨槑鏄疨C,杩樻槸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;

--
Gitblit v1.8.0