| | |
| | | package com.yc.action.login; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.google.gson.Gson; |
| | | import com.yc.action.BaseAction; |
| | | import com.yc.action.grid.GridUtils; |
| | | import com.yc.api.bean.Gfrom; |
| | | import com.yc.api.bean.QrScanType; |
| | | import com.yc.api.bean.attendance.AppSalesSetting; |
| | | import com.yc.api.controller.QrCodeController; |
| | | import com.yc.api.service.QrServiceIfc; |
| | | import com.yc.api.utils.VersionUtils; |
| | | import com.yc.app.v2.entity.SysUserConfigEntity; |
| | | import com.yc.entity.*; |
| | | import com.yc.entity.attachment.AttachmentEntity; |
| | | import com.yc.exception.ApplicationException; |
| | | 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.multiData.SpObserver; |
| | | import com.yc.open.utils.HttpClientUtil; |
| | | 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.sdk.gaodemap.entity.RegeoCodeEntity; |
| | | import com.yc.sdk.password.action.ChangePassword; |
| | | import com.yc.sdk.shopping.action.VerificationCodes; |
| | | import com.yc.sdk.shopping.action.api.InvitationCode; |
| | | import com.yc.sdk.shopping.service.sms.SendSMSMessagesIfc; |
| | | import com.yc.sdk.shopping.util.SettingKey; |
| | | import com.yc.sdk.weixinmp.util.UserAgentUtil; |
| | | import com.yc.sdk.weixinopen.entity.OpenComponentAppSetting; |
| | | import com.yc.service.BaseService; |
| | | import com.yc.service.demo.DemoIfc; |
| | | import com.yc.service.role.RoleIfc; |
| | | import com.yc.service.upload.AttachmentIfc; |
| | | import com.yc.service.user.EquipmentEntry; |
| | | import com.yc.service.user.LoginEquipmentIfc; |
| | | import com.yc.service.user.LoginRecordIfc; |
| | | import com.yc.service.user.UserAccountServiceIfc; |
| | | 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.apache.http.client.methods.HttpPost; |
| | | import org.apache.http.util.EntityUtils; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.dao.DataAccessException; |
| | | import org.springframework.dao.EmptyResultDataAccessException; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.jdbc.core.BeanPropertyRowMapper; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | |
| | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | //@Scope("request") |
| | | @Controller |
| | |
| | | private RoleIfc rIfc; |
| | | @Autowired |
| | | private DemoIfc demoIfc; |
| | | //@Autowired |
| | | //RedisClusterClient redisClusterClient; |
| | | @Autowired |
| | | ThreadPoolTaskExecutor threadPoolExecutor; |
| | | @Autowired |
| | | LoginEquipmentIfc loginEquipmentIfc; |
| | | @Autowired |
| | | SendSMSMessagesIfc sms ; |
| | | @Autowired |
| | | RedisTemplate redisTemplate; |
| | | final Logger log = LoggerFactory.getLogger(this.getClass()); |
| | | private static String attachment_server = AttachmentConfig.get("attachment.server"); |
| | | ; |
| | | |
| | | |
| | | private int prossSN(String cltsn) { |
| | | List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); |
| | |
| | | return r; |
| | | } |
| | | |
| | | @RequestMapping("/login.do") |
| | | @RequestMapping("/login.do") |
| | | public String login(HttpServletRequest request, HttpServletResponse response) { |
| | | String userCode = request.getParameter("account"); |
| | | if (userCode == null || "".equals(userCode)) { |
| | |
| | | UserAccountEntity userAccount = null; |
| | | // -------处理原生APP登录,通过手机号,注册时的密码 by danaus 2018-8-24 |
| | | // 1---有dbid的情况表明是通过选择一个数据源进行登录操作 |
| | | if (VersionUtils.getAPPTypeName(request) != null) {// ios,adnroid调用 |
| | | if (VersionUtils.getAPPTypeName(request) != null) {// ios,android调用 |
| | | try { |
| | | InvitationCode invitationCode = (InvitationCode) FactoryBean.getBean("invitationCode"); |
| | | // userCode代表手机号 (在方法 invitationCode.getDbList() 切换数据源 ) |
| | | |
| | | invitationCode.checkPasswordByTelephone(userCode, password, dbId); |
| | | // 通过数据源id和手机号取得用户usercode进行登录,这时候不需要密码验证 |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | userAccount = userAccountService.getUserInfoByTelephone(userCode);//userCode 手机号 |
| | | if (userAccount != null) { |
| | | userAccount.setApp_userCode(userCode); |
| | | if(userAccount.isInActive()){ |
| | | print2(response, "【" + userCode + "】手机号码已被停用,禁止登录本系统", redirect, isApp); |
| | | return null;// 验证出错返回 |
| | | } |
| | | userAccount.setApp_userCode(userCode);//手机号 |
| | | userAccount.setApp_Password(password); |
| | | userCode = userAccount.getUserCode();//转成ERP的usercode进行登陆 |
| | | password = userAccount.getPassword();//转成ERP的密码进行登陆 |
| | | ch_userid = true; |
| | | //---处理极光别名绑定过多(>10个)的情况,需要查询绑定数量,超过8个则需要删除最后一个,以保证客户端别名设置没问题 |
| | | this.processJiguangAliases(userCode,dbId); |
| | | } else { |
| | | print2(response, "【" + userCode + "】手机号码在ERP系统没有对应的用户信息或已停用", redirect, isApp); |
| | | print2(response, "【" + userCode + "】手机号码未开通ERP系统服务,登录失败", redirect, isApp); |
| | | return null;// 验证出错返回' |
| | | } |
| | | } catch (DataAccessException e) { |
| | |
| | | } |
| | | } |
| | | //这里是短信登录 xin 2020-8-20 11:25:59 |
| | | String phone=request.getParameter("telephone"); |
| | | phone=(phone==null?"":phone); |
| | | String phoneCode=request.getParameter("phoneCode"); |
| | | phoneCode=(phoneCode==null?"":phoneCode); |
| | | if(StringUtils.isBlank(userCode) && !StringUtils.isBlank(phone) && !StringUtils.isBlank(phoneCode)) { |
| | | try { |
| | | @SuppressWarnings("rawtypes") |
| | | RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate"); |
| | | if(!redisTemplate.hasKey("CODE:" + phone + ":" + dbId)) { |
| | | print2(response, "验证码已失效,请重新获取验证码。", redirect, isApp); |
| | | return null; |
| | | } |
| | | if(!phoneCode.equals(redisTemplate.opsForValue().get("CODE:" + phone + ":" + dbId)+"")) { |
| | | print2(response, "验证码错误,请输入正确的验证码", redirect, isApp); |
| | | return null; |
| | | } |
| | | redisTemplate.delete("CODE:" + phone + ":" + dbId);//删除 |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | String phone = request.getParameter("telephone"); |
| | | phone = (phone == null ? "" : phone); |
| | | String phoneCode = request.getParameter("phoneCode"); |
| | | phoneCode = (phoneCode == null ? "" : phoneCode); |
| | | if (StringUtils.isBlank(userCode) && !StringUtils.isBlank(phone) && !StringUtils.isBlank(phoneCode)) { |
| | | try { |
| | | if (!redisTemplate.hasKey("CODE:" + phone + ":" + dbId)) { |
| | | print2(response, "验证码已失效,请重新获取验证码。", redirect, isApp); |
| | | return null; |
| | | } |
| | | if (!phoneCode.equals(redisTemplate.opsForValue().get("CODE:" + phone + ":" + dbId) + "")) { |
| | | print2(response, "验证码错误,请输入正确的验证码", redirect, isApp); |
| | | return null; |
| | | } |
| | | redisTemplate.delete("CODE:" + phone + ":" + dbId);//删除 |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | userAccount = userAccountService.getUserInfoByTelephone(phone);//phone 手机号 |
| | | if (userAccount != null) { |
| | | if(userAccount.isInActive()){ |
| | | print2(response, "【" + phone + "】手机号码已被停用,禁止登录本系统", redirect, isApp); |
| | | return null;// 验证出错返回' |
| | | } |
| | | userCode = userAccount.getUserCode();//转成ERP的usercode进行登陆 |
| | | password = userAccount.getPassword();//转成ERP的密码进行登陆 |
| | | }else { |
| | | print2(response, "【" + phone + "】手机号码在ERP系统没有对应的用户信息或已停用", redirect, isApp); |
| | | return null;// 验证出错返回' |
| | | } else { |
| | | print2(response, "【" + phone + "】手机号码未开通ERP系统服务,登录失败", redirect, isApp); |
| | | return null;// 验证出错返回' |
| | | } |
| | | } catch (Exception e) { |
| | | print2(response, "【" + phone + "】手机号码在ERP系统没有对应的用户信息或已停用", redirect, isApp); |
| | | return null;// 验证出错返回' |
| | | }finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | } catch (Exception e) { |
| | | print2(response, this.getErrorMsg(e), redirect, isApp); |
| | | return null;// 验证出错返回' |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | } |
| | | //---------------- |
| | | // -------- |
| | |
| | | dbId = isone; |
| | | session.setAttribute(SessionKey.DATA_BASE_ID, dbId); |
| | | session.setAttribute(SessionKey.DATABASE_DIS, dataBaseDis); |
| | | // 如果domain为空,则取默认的域名 by danaus 2021/4/12 11:18 |
| | | if (org.apache.commons.lang3.StringUtils.isBlank(domain)) { |
| | | domain = SettingKey.getHostUrl(request); |
| | | } |
| | | session.setAttribute(SessionKey.DOMAIN, domain); |
| | | } |
| | | if (StringUtils.isBlank(userCode)) { |
| | |
| | | return null;// 验证出错返回 |
| | | } |
| | | // 检查限制用户登录时间和登录IP |
| | | |
| | | int s = 0; |
| | | try { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | |
| | | } |
| | | // |
| | | // 设置session |
| | | |
| | | try { |
| | | if (userAccount == null) { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | |
| | | userAccount = userAccountService.getUserInfoByEmail(userCode); //允许邮箱号登录 |
| | | } |
| | | } |
| | | } finally { |
| | | }catch (Exception e){ |
| | | this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp); |
| | | return null; |
| | | }finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | if (userAccount == null) { |
| | | try { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | record.loginRecord(userCode, password, IPUtil.getIpAddr(request));// 记录登录登录失败的信息 |
| | | }catch (Exception e){ |
| | | this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp); |
| | | return null; |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | if (ch_userid) { |
| | | return "{\"ch_error\":\"ch_user_error\",\"info\":\"用户账号不存在!\"}"; |
| | | return "{\"ch_error\":\"ch_user_error\",\"info\":\"未开通ERP系统服务,登录失败!\"}"; |
| | | } else { |
| | | this.print2(response, "用户账号不存在!", request.getParameter("redirect"), isApp); |
| | | this.print2(response, "未开通ERP系统服务,登录失败!", request.getParameter("redirect"), isApp); |
| | | return null; |
| | | } |
| | | } |
| | |
| | | try { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | record.loginRecord(userCode, password, IPUtil.getIpAddr(request));// 记录登录登录失败的信息 |
| | | }catch (Exception e){ |
| | | this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp); |
| | | return null; |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | |
| | | this.print2(response, ex.getMessage(), request.getParameter("redirect"), isApp); |
| | | return null; |
| | | } |
| | | // 判断用户APP登录时是否禁用 |
| | | if (isApp && userAccount.getActiveApp() == 1) { |
| | | this.print2(response, "用户APP端禁止登录!如有问题,请联系管理员", request.getParameter("redirect"), isApp); |
| | | // 判断用户登录时是否禁用 |
| | | if (userAccount.isInActive()) { |
| | | this.print2(response, "用户账号已禁止登录!如有问题,请联系管理员", request.getParameter("redirect"), isApp); |
| | | return null; |
| | | } |
| | | processLoginUserToSession(ip, dbId, session, userAccount); |
| | | |
| | | |
| | | // -------------- |
| | | // String ucode = account + Math.random();// 是为了区分用户重复问题,同一用户可以多人使用。 |
| | | // session.setAttribute(SessionKey.SAIL_USERCODE, ucode); |
| | | // OnLineUser.setOnlineUser(dataString, ucode, session); |
| | | /* |
| | | * WebApplicationContext webApplicationContext = |
| | | * ContextLoader.getCurrentWebApplicationContext(); ServletContext |
| | | * servletContext = |
| | | * webApplicationContext.getServletContext();//取得ServletContext对象实例 |
| | | * if((OnLineUser)servletContext.getAttribute("onlineuserlistener")==null) { |
| | | * OnLineUser onuser=new |
| | | * OnLineUser();//只设置一次,不同于上面日志文件的记录每次会话均设置。即当第一个客户连接到服务器时启动一个全局变量, |
| | | * 此后所有的客户将使用相同的上下文。 servletContext.setAttribute("onlineuserlistener",onuser);// |
| | | * 将监听器对象设置成ServletContext的属性,具有全局范围有效性,即所有的客户均可以取得它的实例。 } |
| | | * session.setAttribute("onlineuserlistener",(OnLineUser)servletContext. |
| | | * getAttribute("onlineuserlistener"));//取出此全局对象,并且将此对象绑定到某个会话中, |
| | | * 此举将促使监听器调用valueBound,计数器加一。 |
| | | */ |
| | | // session.setAttribute(SessionKey.ONLINE_USERS, new OnLineUser());// 在线人数统计 |
| | | // ------------------ |
| | | |
| | | |
| | | if (isApp) { |
| | | session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_APP);//app 类型 |
| | | //判断当前登录设备是否与最新一次登录设备是一样,不一样需要返回给前端,输出短信进行验证登录 |
| | | |
| | | } else if (redirect != null && !"".equals(redirect)) { // 增加登录后重定向页面功能,added by Johns Wang, 2016-02-17 |
| | | session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_MINIAPP);//miniapp 类型 |
| | | } else { |
| | | session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_WEB);//web 类型 |
| | | } |
| | | final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbId); |
| | | //--------------------------------- |
| | | |
| | | if(dataSourceMap.isLoginOnceForOneUserCode()) { |
| | | //开启了账号只能在相同类型设备上登录一个,禁止多方登录 |
| | | if (isApp) { |
| | | //---验证当前设备是否为上一次登录设备 |
| | | //---1,检查是否有发送SMS验证的标记,有则不需要查,表明之前已查过,跳过下面checkSameEquipmentByLastLogin方法 |
| | | final Object object = request.getAttribute("loginByCode"); |
| | | if(object==null){ |
| | | EquipmentEntry equipmentEntry=null; |
| | | try { |
| | | SpObserver.setDBtoDemo(); |
| | | equipmentEntry = loginEquipmentIfc.checkSameEquipmentByLastLogin(userAccount.getApp_userCode(), request.getHeader("x-app-uniqueIdentifier")); |
| | | }catch (Exception e){ |
| | | printJson(response, callBackMessage.sendErrorMessage(this.getErrorMsg(e))); |
| | | return null; |
| | | }finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | if(equipmentEntry!=null&& org.apache.commons.lang3.StringUtils.isNotBlank(equipmentEntry.getEquipmentName())) { |
| | | //log.info(JSON.toJSONString("equipmentEntry:"+equipmentEntry)); |
| | | //2----不相同,则需要SMS进行验证登录 |
| | | session.invalidate();//删除当前会话 |
| | | String error=String.format("已在另一台设备%s登录,登录时间%s,如果需要在本机登录,则需要验证您的身份。",equipmentEntry.getEquipmentName(),equipmentEntry.getLastLogonDate()); |
| | | 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); |
| | | //------------------------------- |
| | | //--APP用户配置组装成对象输出 |
| | | SysUserConfigEntity sysUserConfigEntity=new SysUserConfigEntity(); |
| | | sysUserConfigEntity.setSwitchToPageWhenLogonApp(session.getAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP)+""); |
| | | sysUserConfigEntity.setSelectNextDocumentWhenApproved(session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED)==null?0:Integer.parseInt(session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED)+"")); |
| | | sysUserConfigEntity.setIsStartupPopupMessages(session.getAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES)==null?0:Integer.parseInt(session.getAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES)+"")); |
| | | session.setAttribute("userConfig",sysUserConfigEntity); |
| | | if (isApp) { |
| | | QrServiceIfc qrServiceIfc = (QrServiceIfc) FactoryBean.getBean("qrService"); |
| | | try { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | AppSalesSetting appSalesSetting = qrServiceIfc.getAppSalesOrderStyle(); |
| | | //加到会话 |
| | | session.setAttribute(SessionKey.APP_SALESORDER_MATCODE_LIST, appSalesSetting.getAppSalesOrderMatCodeList()); |
| | | session.setAttribute(SessionKey.APP_SALESORDER_STYLE, appSalesSetting.getAppSalesOrderStyle()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | throw new ApplicationException(e.getMessage()); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | Map<String, Object> map = new HashMap<String, Object>(); |
| | | map.put("success", "ok"); |
| | | map.put("sessionid", session.getId()); |
| | |
| | | } |
| | | } |
| | | map.put("avatarUnid", avatarUnid); |
| | | |
| | | map.put("attachment_server", attachment_server); |
| | | map.put("url", domain == null ? "" : domain); |
| | | if (request.getAttribute("postTokenV2") == null) { |
| | |
| | | } |
| | | |
| | | //---增加扫码显示方式 |
| | | QrServiceIfc qrServiceIfc= (QrServiceIfc) FactoryBean.getBean("qrService"); |
| | | QrScanType qrScanType=null; |
| | | |
| | | QrScanType qrScanType = null; |
| | | //显示下单图标 |
| | | int appSalesMenuIcon = 0; |
| | | try { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | qrScanType= qrServiceIfc.getQrScanType(userAccount.getUserCode(), userAccount.getUserName()); |
| | | }catch (EmptyResultDataAccessException e){ |
| | | //不处理,合理存在的情况 |
| | | qrScanType=new QrScanType(); |
| | | }catch (Exception e){ |
| | | qrScanType = qrServiceIfc.getQrScanType(userAccount.getUserCode(), userAccount.getUserName()); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | }finally { |
| | | throw new ApplicationException(e.getMessage()); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | //---增加是否可以显示下单图标 |
| | | try { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | BaseService baseService = (BaseService) FactoryBean.getBean("BaseService"); |
| | | List<Gfrom> list = baseService.getJdbcTemplate().query("select a.formid,a.formname from gform a where exists(select 1 from gfield b where a.formid = b.formid and b.fieldid in ( 'matcode','barcode','qrcode') and b.ScanCodeField = 1 )", new BeanPropertyRowMapper<>(Gfrom.class)); |
| | | |
| | | if (list != null && list.size() > 0) { |
| | | QrCodeController qrCodeController = (QrCodeController) FactoryBean.getBean("qrCodeController"); |
| | | List tempList = qrCodeController.procFormLimit(request, list); |
| | | if (tempList != null && tempList.size() > 0) { |
| | | appSalesMenuIcon = 1; |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | throw new ApplicationException(e.getMessage()); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | map.put("sessionInfo", getSessionInfo(session)); |
| | | map.put("isAdmin", session.getAttribute(SessionKey.SUPPER_USER)); |
| | | final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbId); |
| | | map.put("isShowAttendance", dataSourceMap.isShowAttendanceButton()?1:0);//打卡 |
| | | map.put("userType", session.getAttribute(SessionKey.USERTYPE)); |
| | | map.put("isStopSystem", session.getAttribute(SessionKey.isStopSystem)); |
| | | map.put("isAdmin", ("SuperUser".equalsIgnoreCase(session.getAttribute(SessionKey.USERTYPE) + "") || "DeveloperUser".equalsIgnoreCase(session.getAttribute(SessionKey.USERTYPE) + "")) ? 1 : 0);//非普通用户都有所有权限 |
| | | map.put("isShowAttendance", dataSourceMap.isShowAttendanceButton() ? 1 : 0);//打卡 |
| | | map.put("qrDisplayType", qrScanType.getScanMeterialAction());//扫码显示方式 |
| | | map.put("appSalesMenuIcon", appSalesMenuIcon);//是否显示下单图标,0不显示,1显示 |
| | | map.put("isRelatingMaterialWhenNewCustomer", qrScanType.getIsRelatingMaterialWhenNewCustomer());//是否关联客户 |
| | | OpenComponentAppSetting openComponentAppSetting=OpenComponentAppSetting.defaultSettings(); |
| | | map.put("mobileAppId", openComponentAppSetting==null?null:openComponentAppSetting.getMobileAppId());//小程序id |
| | | map.put("mobileAppSecret", openComponentAppSetting==null?null:openComponentAppSetting.getMobileAppSecret());//小程序MobileAppSecret |
| | | OpenComponentAppSetting openComponentAppSetting = OpenComponentAppSetting.defaultSettings(); |
| | | map.put("mobileAppId", openComponentAppSetting == null ? null : openComponentAppSetting.getMobileAppId());//小程序id |
| | | map.put("mobileAppSecret", openComponentAppSetting == null ? null : openComponentAppSetting.getMobileAppSecret());//小程序MobileAppSecret |
| | | map.put("miniAppOrgId", dataSourceMap.getMiniAppOrgId());//小程序miniAppOrgId |
| | | map.put("isModifyPriceWhenScanQrCode", session.getAttribute(SessionKey.ISMODIFYPRICEWHENSCANQRCODE)); |
| | | map.put("isModifyPriceWhenSalesOrder", session.getAttribute(SessionKey.ISMODIFYPRICEWHENSALESORDER)); |
| | | map.put("isModifyPriceWhenPurchaseOrder", session.getAttribute(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER)); |
| | | map.put("switchToPageWhenLogonApp", session.getAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP)); |
| | | map.put("selectNextDocumentWhenApproved", session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED)); |
| | | map.put("userConfig", sysUserConfigEntity); |
| | | map.put("perssion", session.getAttribute(SessionKey.PERSSION)); |
| | | this.printJson(response, GridUtils.toJson(map)); |
| | | session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_APP);//app 类型 |
| | | return null; |
| | | } else if (redirect != null && !"".equals(redirect)) { // 增加登录后重定向页面功能,added by Johns Wang, 2016-02-17 |
| | | //return "redirect:" + redirect; |
| | | callBackMessage.sendSuccessMessage("登录成功"); |
| | | callBackMessage.setData("{\"redirect\":\"" + redirect + "\"}"); |
| | | session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_MINIAPP);//miniapp 类型 |
| | | this.printJson(response, callBackMessage.toString()); |
| | | return null; |
| | | } else { |
| | | session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_WEB);//web 类型 |
| | | if (ch_userid) |
| | | return "{\"ok\":\"ch_user_ok\",\"info\":\"" + userCode + "\"}"; |
| | | else { |
| | |
| | | return null; |
| | | } |
| | | } |
| | | } catch (IllegalStateException e) { |
| | | }catch (IllegalStateException e) { |
| | | e.printStackTrace(); |
| | | if (e.getMessage().contains("Session already invalidated")) { |
| | | if (e.getMessage()!=null&&e.getMessage().contains("Session already invalidated")) { |
| | | sb.append("会话已过期,请关闭浏览器再重新登录系统\\n"); |
| | | print2(response, sb.toString(), redirect, isApp); |
| | | System.out.println(this.getClass() + " sessionid:" + session.getId()); |
| | |
| | | return null; |
| | | } catch (RuntimeException e) { |
| | | e.printStackTrace(); |
| | | if (e.getMessage().equals(SessionKey.DEMO_REF)) { |
| | | if (e.getLocalizedMessage()!=null&&e.getMessage().equals(SessionKey.DEMO_REF)) { |
| | | session.setAttribute(SessionKey.DEMO_REF, SessionKey.DEMO_REF); |
| | | this.print(response, "<script>alert('请生成正确的配置信息');window.location.href='/demo/demoList.jsp';</script>"); |
| | | }else{ |
| | | this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp); |
| | | } |
| | | return null; |
| | | } catch (Exception e) {// 不存在此账号 |
| | | }catch (GdErrorException e) {// 不存在高德地图apiKey |
| | | e.printStackTrace(); |
| | | this.print2(response, "高德地图KEY不存在,请在数据源里维护好", request.getParameter("redirect"), isApp); |
| | | return null; |
| | | } |
| | | catch (Exception e) {// 不存在此账号 |
| | | e.printStackTrace(); |
| | | proccError(userCode, password, request, response); |
| | | return null; |
| | | } |
| | | } |
| | | private void singleAccount(String userFromType,String dbId, UserAccountEntity userAccount, HttpServletRequest request){ |
| | | HttpSession session = request.getSession(); |
| | | List<OnlineUserEntity> onLineUser = SessionListener.getOnLineUser(request, dbId);//tomcat集群是采用会话复制,所以每个tomcat里的会话信息是一样,取到同一数据源所有会话,从中取到当前用户的会话 |
| | | 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())//排除当前的会话,取同账号的之前会话 |
| | | ){ |
| | | //只要会话存在,发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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | private String genToken(String pwd, String usercode, int dbid) { |
| | | TokenInfo tokenInfo = new TokenInfo(); |
| | |
| | | try { |
| | | String key = "Lg_Token:" + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode(); |
| | | |
| | | RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate"); |
| | | |
| | | Object object = redisTemplate.opsForValue().get(key); |
| | | //if (object == null) { |
| | | //不存在则加到redis里,过期时间设置为12小时 |
| | |
| | | |
| | | } |
| | | |
| | | public boolean processLoginUserToSessionV2( String ip, String dbId, HttpServletRequest request, UserAccountEntity userAccount) throws Exception { |
| | | HttpSession session = request.getSession(); |
| | | // 设置权限 |
| | | LoginUserEntity userEntity = new LoginUserEntity(); |
| | | final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbId); |
| | | try { |
| | | userEntity.setDbid(dbId); |
| | | userEntity.setSystemDescribe(dataSourceMap.getSystemDescribe()); |
| | | userEntity.setLogonDomain(request.getHeader("host")); |
| | | if (request.getParameter("isApp") != null || request.getAttribute("isApp") != null) { |
| | | // 手机app传过来 |
| | | userEntity.setOSType(request.getHeader("x-app-type"));//ios,android |
| | | String equipmentCode = request.getHeader("x-app-equipmentCode"); |
| | | String appVersion = request.getHeader("x-app-version");//app版本号 |
| | | String uniqueIdentifier = request.getHeader("x-app-uniqueIdentifier");//设备唯一码 |
| | | userEntity.setUniqueIdentifier(uniqueIdentifier); |
| | | userEntity.setAppVersion(appVersion); |
| | | userEntity.setEquipmentModel(equipmentCode);//设备型号 |
| | | userEntity.setUserLoginType("app"); |
| | | //--从设备型号提取生产商名称, |
| | | if (org.apache.commons.lang3.StringUtils.isNotBlank(equipmentCode)) { |
| | | String[] equipment = equipmentCode.split("\\s+?");//空格分隔,取第一个作为生产商 |
| | | userEntity.setManufacturer(equipment[0]); |
| | | } |
| | | |
| | | } else { |
| | | //pc ,小程序 |
| | | int userLoginType = session.getAttribute(SessionKey.USER_LOGIN_TYPE)==null?1:Integer.parseInt(session.getAttribute(SessionKey.USER_LOGIN_TYPE)+""); |
| | | if (userLoginType==3) { |
| | | userEntity.setUserLoginType("minapp"); |
| | | } else { |
| | | userEntity.setUserLoginType("web"); |
| | | } |
| | | String userAgentString = UserAgentUtil.getUaInfo(request); // request.getHeader("User-Agent"); |
| | | UserAgent userAgent = UserAgent.parseUserAgentString(userAgentString); |
| | | String os = userAgent.getOperatingSystem().getGroup().getName(); |
| | | //String osName = userAgent.getOperatingSystem().getName() ; |
| | | String manufacturer = userAgent.getOperatingSystem().getManufacturer().getName(); |
| | | String model = UserAgentUtil.getPhoneModel(userAgentString); |
| | | //String mobileOS = UserAgentUtil.getMobileOS(userAgentString); |
| | | userEntity.setOSType(os); |
| | | userEntity.setManufacturer(manufacturer); |
| | | userEntity.setEquipmentModel(model); |
| | | userEntity.setUserAgent(userAgentString); |
| | | } |
| | | String longitude = request.getHeader("x-app-longitude"); |
| | | String latitude = request.getHeader("x-app-latitude"); |
| | | |
| | | //---通过经纬度,IP 获取地理信息(国,省,市,区) |
| | | if(org.apache.commons.lang3.StringUtils.isNotBlank(dataSourceMap.getGeoWebApiKey())) { |
| | | GdMapService gdMapService = GdMapServiceInit.getGdMapService(dataSourceMap.getGeoWebApiKey()); |
| | | final RegeoCodeEntity regeo = gdMapService.getRegeoV2(longitude, latitude, ip); |
| | | if (regeo != null) { |
| | | userEntity.setCountryName(regeo.getCountry()); |
| | | userEntity.setProvinceName(regeo.getProvince()); |
| | | userEntity.setCityName(regeo.getCity()); |
| | | userEntity.setCountyName(regeo.getDistrict()); |
| | | } |
| | | } |
| | | userEntity.setLongitude(longitude); |
| | | userEntity.setLatitude(latitude); |
| | | userEntity.setIp(ip); |
| | | |
| | | PerssionEntity perssionEntity = new PerssionEntity(); |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | perssionEntity.setRole(rIfc.getRole(userAccount.getUserCode())); |
| | | perssionEntity.setPerssion(userAccountService.getUserProfiles(userAccount.getUserCode())); |
| | | if (userAccount.getDefaultSet() != null && !"".equals(userAccount.getDefaultSet())) { |
| | | perssionEntity.setDefaultSet(userAccountService.getDefaultSet(userAccount.getDefaultSet())); |
| | | } |
| | | |
| | | // 保存会话 session信息 |
| | | setSessionValues(dbId, userAccount, session, perssionEntity); |
| | | // 登录成功清除登录错误信息 |
| | | record.clearLoginRecord(userAccount.getUserCode()); |
| | | // 记录登录信息 |
| | | userAccountService.loginLogV2(userAccount, userEntity, session.getId()); |
| | | |
| | | } finally{ |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | // if (dataSourceMap.isLoginOnceForOneUserCode() &&request.getAttribute("loginByCode") != null) { |
| | | //启用限制多设备登录,且通过短信二次验证登录 |
| | | try { |
| | | SpObserver.setDBtoDemo(); |
| | | userEntity.setTelePhone(userAccount.getApp_userCode());//手机号 |
| | | loginEquipmentIfc.updateUserLoginEquipmentInfo(userEntity); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | // } |
| | | return true; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * APP 自动登录接口 |
| | | * |
| | |
| | | TokenInfo tokenInfo = gson.fromJson(value, new com.google.gson.reflect.TypeToken<TokenInfo>() { |
| | | }.getType()); |
| | | |
| | | RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate"); |
| | | |
| | | Object object = redisTemplate.opsForValue().get("Lg_Token:" + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode()); |
| | | if (object == null) { |
| | | this.printJson(response, "{\"error\":\"token已失效,请重新登录\"}"); |
| | |
| | | Gson gson = new Gson(); |
| | | TokenInfo tokenInfo = gson.fromJson(value, new com.google.gson.reflect.TypeToken<TokenInfo>() { |
| | | }.getType()); |
| | | RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate"); |
| | | |
| | | //System.out.println("aaaaaa>>>>"+value); |
| | | //System.out.println("bbbbb>>>>"+InvitationCode.TOKEN_STR + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode()); |
| | | Object object = redisTemplate.opsForValue().get(InvitationCode.TOKEN_STR + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode()); |
| | |
| | | return ""; |
| | | } |
| | | //405调用需要刷新过期时间 |
| | | if(request.getParameter("refresh")!=null&&"1".equalsIgnoreCase(request.getParameter("refresh"))) { |
| | | if (request.getParameter("refresh") != null && "1".equalsIgnoreCase(request.getParameter("refresh"))) { |
| | | //刷新key过期时间 |
| | | redisTemplate.opsForValue().getOperations().expire(InvitationCode.TOKEN_STR + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode(), 12, TimeUnit.HOURS); |
| | | } |
| | |
| | | // this.printJson(response, callBackMessage.sendErrorMessage("不是合法的token", -1001)); |
| | | // return null; |
| | | // } |
| | | |
| | | //检查数据源是否已禁用 |
| | | final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap("" + tokenInfo.getDbid()); |
| | | if(dataSourceMap!=null){ |
| | | Integer expiredMinute = (dataSourceMap.getExpiredMinute() == null ? null : (Integer) dataSourceMap.getExpiredMinute());//过期时间:null或负数表示未过期,正数表示已过期 |
| | | boolean actived = dataSourceMap.getActived(); |
| | | if ((expiredMinute != null && expiredMinute.intValue() > 0) || !actived) { |
| | | throw new ApplicationException("系统已过期,请联络服务提供商"); |
| | | } |
| | | } |
| | | //进行登录操作 |
| | | tokenInfo.setPwd(tokenStr[0]); |
| | | request.setAttribute("account", tokenInfo.getUsercode()); |
| | |
| | | request.setAttribute("dataName", tokenInfo.getDbid() + ""); |
| | | request.setAttribute("isone", tokenInfo.getDbid() + ""); |
| | | request.setAttribute("postTokenV2", "1");//说明是通过V2版提交,之后在登录成功后就不返回token。 |
| | | if(org.apache.commons.lang3.StringUtils.isNotBlank(request.getParameter("loginByCode"))) { |
| | | request.setAttribute("loginByCode", 1);//限制设备功能新增 |
| | | } |
| | | |
| | | } catch (Exception ex) { |
| | | this.printJson(response, callBackMessage.sendErrorMessage(this.getErrorMsg(ex), -1)); |
| | | this.printJson(response, callBackMessage.sendErrorMessage(this.getErrorMsg(ex))); |
| | | return ""; |
| | | } |
| | | return login(request, response); |
| | | } |
| | | |
| | | /** |
| | | * SMS验证码进行登录 |
| | | * @param code |
| | | * @param request |
| | | * @param response |
| | | * @return |
| | | */ |
| | | @RequestMapping("/api/loginByCode.do") |
| | | public String loginByCode(String tel, String code, HttpServletRequest request, HttpServletResponse response) { |
| | | CallBackMessage callBackMessage = new CallBackMessage(); |
| | | if (org.apache.commons.lang3.StringUtils.isBlank(code)) { |
| | | this.printJson(response, callBackMessage.sendErrorMessage("验证码不能为空", -1)); |
| | | return ""; |
| | | } |
| | | String verifyCode = (String) redisTemplate.opsForValue().get(VerificationCodes.getCodeKey(tel)); |
| | | if (verifyCode==null) { |
| | | printJson(response, callBackMessage.sendErrorMessage("验证码已失效,请重新获取验证码。",-1)); |
| | | return ""; |
| | | } |
| | | if (!code.equals(verifyCode)) { |
| | | printJson(response, callBackMessage.sendErrorMessage("验证码错误,请输入正确的验证码",-1)); |
| | | return ""; |
| | | }else { |
| | | redisTemplate.delete(VerificationCodes.getCodeKey(tel));//删除 |
| | | printJson(response, callBackMessage.sendSuccessMessageByDefault()); |
| | | return ""; |
| | | } |
| | | } |
| | | /** |
| | | * 处理极光别名 |
| | | * 先查询当前别名已绑定的设备数,如果超过8个则删除最后一个别人 |
| | | * @param usercode |
| | | * @param dbid |
| | | */ |
| | | public void processJiguangAliases(String usercode,String dbid){ |
| | | try { |
| | | //查询别名绑定的设备列表 |
| | | String aliase=dbid+"_"+usercode; |
| | | String url = JpushAction.URL + "/v3/aliases/"+aliase+"?new_format=true"; |
| | | final HttpGet httpGet = HttpClientUtil.CreateHttpGetByAuthorization(url, null, JpushAction.appKey, JpushAction.masterSecret); |
| | | CloseableHttpResponse response = HttpClientUtil.getClient().execute(httpGet); |
| | | if (response.getStatusLine().getStatusCode() == 200) { |
| | | final Map map = JSON.parseObject(EntityUtils.toString(response.getEntity(), "UTF-8"), Map.class); |
| | | |
| | | List<JiGuangAliaseEntity> list= JSON.parseArray(map.get("data") + "",JiGuangAliaseEntity.class); |
| | | if(list!=null&&list.size()>8){ |
| | | //--处理为只保留最新活跃天数的8个设备 |
| | | StringJoiner joiner=new StringJoiner(","); |
| | | int index=0; |
| | | list= list.stream().sorted(Comparator.comparing(JiGuangAliaseEntity::getLast_online_date).reversed()).collect(Collectors.toList()); |
| | | for (JiGuangAliaseEntity entity:list){ |
| | | if(index>8){ |
| | | joiner.add("\""+entity.getRegistration_id()+"\""); |
| | | } |
| | | index++; |
| | | }; |
| | | //---解绑多出来的设备 |
| | | url=JpushAction.URL+"/v3/aliases/"+aliase; |
| | | String data="{\n" + |
| | | " \"registration_ids\":{\"remove\": ["+joiner.toString()+"]}\n" + |
| | | "}"; |
| | | |
| | | final HttpPost httpPost = HttpClientUtil.CreateHttpPostByAuthorization(url, data, false, JpushAction.appKey, JpushAction.masterSecret); |
| | | response = HttpClientUtil.getClient().execute(httpPost); |
| | | if (response.getStatusLine().getStatusCode() !=200) { |
| | | log.info(usercode+"需要删除的极光别名关联设备ID:"+data); |
| | | String msg= EntityUtils.toString(response.getEntity(), "UTF-8"); |
| | | throw new ApplicationException("删除极光别名关联设备出错:"+msg); |
| | | } |
| | | } |
| | | } else { |
| | | throw new ApplicationException("获取极光别名出错:" + response.getStatusLine().getStatusCode() + "[" + response.getStatusLine().getReasonPhrase() + "]"); |
| | | } |
| | | |
| | | }catch (Exception e){ |
| | | System.out.println(e.getCause()==null?e.getMessage():e.getCause().getMessage()); |
| | | } |
| | | } |
| | | private void print2(HttpServletResponse response, String sb, String redirect, Boolean isApp) { |
| | | CallBackMessage callBackMessage = new CallBackMessage(); |
| | | // redirect Added by Johns Wang, 2016-03-06 |
| | |
| | | } |
| | | callBackMessage.sendErrorMessage(sb); |
| | | if (isApp != null && isApp) { |
| | | if("密码错误".equalsIgnoreCase(sb)){ |
| | | if ("密码错误".equalsIgnoreCase(sb)) { |
| | | //密码不正确 以状态码为-1004返回给app,弹出登录界面 |
| | | callBackMessage.sendErrorMessage(sb,-1004); |
| | | callBackMessage.sendErrorMessage(sb, -1004); |
| | | } |
| | | this.print(response, callBackMessage.toString()); |
| | | } else { |
| | |
| | | map.put(SessionKey.CCCODEPERMISSION.replace("@", ""), session.getAttribute(SessionKey.CCCODEPERMISSION)); |
| | | map.put(SessionKey.USERTYPE.replace("@", ""), session.getAttribute(SessionKey.USERTYPE)); |
| | | map.put(SessionKey.ISMODIFYPRICEWHENSCANQRCODE, session.getAttribute(SessionKey.ISMODIFYPRICEWHENSCANQRCODE)); |
| | | map.put(SessionKey.ISMODIFYPRICEWHENSALESORDER, session.getAttribute(SessionKey.ISMODIFYPRICEWHENSALESORDER)); |
| | | map.put(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER, session.getAttribute(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER)); |
| | | map.put(SessionKey.SWITCHTOPAGEWHENLOGONAPP, session.getAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP)); |
| | | map.put(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED, session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED)); |
| | | map.put(SessionKey.ISSTARTUPPOPUPMESSAGES, session.getAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES)); |
| | | map.put("day", DateUtil.getDay(0)); |
| | | map.put("month", DateUtil.getMonth(0)); |
| | | map.put("year", DateUtil.getYear(0)); |
| | |
| | | } |
| | | |
| | | private void proccError(String account, String pwd, HttpServletRequest request, HttpServletResponse response) { |
| | | Boolean isApp = Boolean.valueOf(request.getParameter("isApp") == null ? false : true);// 手机app传过来 |
| | | Boolean isApp = Boolean.valueOf((request.getParameter("isApp") == null&&request.getAttribute("isApp") == null) ? false : true);// 手机app传过来 |
| | | try { |
| | | SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); |
| | | record.loginRecord(account, pwd, IPUtil.getIpAddr(request));// 记录登录登录失败的信息 |
| | | } catch (Exception e2) { |
| | | e2.printStackTrace(); |
| | | this.print2(response, e2.getMessage().replace("\"", ""), request.getParameter("redirect"), isApp); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | |
| | | session.setAttribute(SessionKey.DEPARTMENT, userAccount.getCcName()); |
| | | session.setAttribute(SessionKey.CCCODE, userAccount.getCcCode()); |
| | | session.setAttribute(SessionKey.CCNAME, userAccount.getCcName()); |
| | | session.setAttribute(SessionKey.USER_TELE_PHONE, userAccount.getApp_userCode());//手机号 |
| | | session.setAttribute(SessionKey.SUPPER_USER, |
| | | "superuser".equalsIgnoreCase((userAccount.getUserType())) ? "1" : "0");// 系统管理员 |
| | | ("SuperUser".equalsIgnoreCase(userAccount.getUserType()) || "DeveloperUser".equalsIgnoreCase(userAccount.getUserType())) ? "1" : "0");// 系统管理员 |
| | | session.setAttribute(SessionKey.isStopSystem, userAccount.isStopSystem() ? "1" : "0"); |
| | | session.setAttribute(SessionKey.OPEN_ID, userAccount.getOpenId());// openid号 |
| | | session.setAttribute(SessionKey.CURRENCY, userAccount.getCurrency()); |
| | |
| | | session.setAttribute(SessionKey.DEFAULT_BRAND, userAccount.getDefaultBrand()); |
| | | session.setAttribute(SessionKey.CCCODEPERMISSION, userAccount.getCcCodePermission()); |
| | | session.setAttribute(SessionKey.ISMODIFYPRICEWHENSCANQRCODE, userAccount.getIsModifyPriceWhenScanQrCode()); |
| | | session.setAttribute(SessionKey.USERTYPE,userAccount.getUserType() ); |
| | | session.setAttribute(SessionKey.ISMODIFYPRICEWHENSALESORDER, userAccount.getIsModifyPriceWhenSalesOrder()); |
| | | session.setAttribute(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER, userAccount.getIsModifyPriceWhenPurchaseOrder()); |
| | | session.setAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP, userAccount.getSwitchToPageWhenLogonApp()); |
| | | session.setAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED, userAccount.getSelectNextDocumentWhenApproved()); |
| | | session.setAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES, userAccount.getIsStartupPopupMessages()); |
| | | session.setAttribute(SessionKey.USERTYPE, userAccount.getUserType()); |
| | | |
| | | session.setAttribute(SessionKey.PAGE_PATH, |
| | | File.separator + "app" + File.separator + session.getAttribute(SessionKey.DATA_BASE_ID) + File.separator |
| | |
| | | SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 |
| | | session.setAttribute(SessionKey.LOGIN_TIME, df.format(new Date()));//登录时间 xin 2020-8-31 11:35:22 |
| | | |
| | | session.setAttribute(SessionKey.WEIXIN_USERID,userAccount.getWeiXinCorpUserId()); //企业微信登录userid ,Added by Johns Wang,2022-12-23 |
| | | return userName; |
| | | |
| | | } |
| | |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | |
| | | this.print2(response, "用户账号不存在!", request.getParameter("redirect"), isApp); |
| | | this.print2(response, usercode+"未开通ERP系统服务,登录失败", request.getParameter("redirect"), isApp); |
| | | return null; |
| | | }else { |
| | | if(userAccount.isInActive()){ |
| | | this.print2(response, usercode+"已被停用,禁止登录本系统!", request.getParameter("redirect"), isApp); |
| | | return null; |
| | | } |
| | | } |
| | | try { |
| | | if (!userAccount.checkPassword(password)) { |
| | |
| | | } 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); |
| | | } |
| | | // 设置权限 |
| | | processLoginUserToSession(ip, dbid, session, userAccount); |
| | | 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; |
| | |
| | | SpObserver.setDBtoInstance("_" + mDbId); |
| | | mUserAccount = userAccountService.getUserInfoByTelephone(mUserCode); |
| | | if (mUserAccount != null) { |
| | | if(mUserAccount.isInActive()){ |
| | | print2(mResponse, mUserCode+"已被停用,禁止登录本系统", mRedirect, mIsApp); |
| | | myResult = true; |
| | | return this; |
| | | } |
| | | mUserAccount.setApp_userCode(mUserCode); |
| | | mUserAccount.setApp_Password(mPassword); |
| | | mUserCode = mUserAccount.getUserCode();//转成ERP的usercode进行登陆 |
| | | mPassword = mUserAccount.getPassword();//转成ERP的密码进行登陆 |
| | | mCh_userid = true; |
| | | } else { |
| | | print2(mResponse, "该手机号码没有对应用户信息", mRedirect, mIsApp); |
| | | print2(mResponse, mUserCode+"未开通ERP系统服务,登录失败", mRedirect, mIsApp); |
| | | myResult = true; |
| | | return this; |
| | | } |