| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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); |
| | | //------------------------------- |
| | |
| | | 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) { |
| | |
| | | } 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());//手机号 |
| | |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | } |
| | | // } |
| | | return true; |
| | | } |
| | | |
| | |
| | | } 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; |