fix: 优化扫描登录相关代码

This commit is contained in:
paulGao 2022-09-19 09:23:56 +08:00
parent 3786c53cad
commit 3549b216b0
2 changed files with 42 additions and 35 deletions

View File

@ -3,7 +3,6 @@ package cn.lili.controller.passport;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
@ -58,41 +57,42 @@ public class MemberBuyerController {
} }
/** /**
* 长轮询参考nacos * 长轮询参考nacos
*
* @param token * @param token
* @param beforeSessionStatus 上次记录的session状态 * @param beforeSessionStatus 上次记录的session状态
* @return * @return
*/ */
@ApiOperation(value = "web-二维码登录") @ApiOperation(value = "web-二维码登录")
@PostMapping(value = "/session_login/{token}", produces = "application/json;charset=UTF-8") @PostMapping(value = "/session_login/{token}", produces = "application/json;charset=UTF-8")
public Object loginWithSession(@PathVariable("token") String token,Integer beforeSessionStatus) { public Object loginWithSession(@PathVariable("token") String token, Integer beforeSessionStatus) {
log.info("receive login with session key {}", token); log.info("receive login with session key {}", token);
ResponseEntity<ResultMessage> timeoutResponseEntity = ResponseEntity<ResultMessage<Object>> timeoutResponseEntity =
new ResponseEntity<>(ResultUtil.error(ResultCode.ERROR), HttpStatus.OK); new ResponseEntity<>(ResultUtil.error(ResultCode.ERROR), HttpStatus.OK);
int timeoutSecond = 20; int timeoutSecond = 20;
DeferredResult<ResponseEntity> deferredResult = new DeferredResult<>(timeoutSecond * 1000L, timeoutResponseEntity); DeferredResult<ResponseEntity<Object>> deferredResult = new DeferredResult<>(timeoutSecond * 1000L, timeoutResponseEntity);
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
try { try {
int i = 0; int i = 0;
while (i < timeoutSecond) { while (i < timeoutSecond) {
QRLoginResultVo queryResult = memberService.loginWithSession(token); QRLoginResultVo queryResult = memberService.loginWithSession(token);
int status = queryResult.getStatus(); int status = queryResult.getStatus();
if(status==beforeSessionStatus if (status == beforeSessionStatus
&& (QRCodeLoginSessionStatusEnum.WAIT_SCANNING.getCode()==status && (QRCodeLoginSessionStatusEnum.WAIT_SCANNING.getCode() == status
|| QRCodeLoginSessionStatusEnum.SCANNING.getCode()==status)){ || QRCodeLoginSessionStatusEnum.SCANNING.getCode() == status)) {
//睡眠一秒种继续等待结果 //睡眠一秒种继续等待结果
TimeUnit.SECONDS.sleep(1); TimeUnit.SECONDS.sleep(1);
}else{ } else {
deferredResult.setResult(new ResponseEntity<>(ResultUtil.data(queryResult), HttpStatus.OK)); deferredResult.setResult(new ResponseEntity<>(ResultUtil.data(queryResult), HttpStatus.OK));
break; break;
} }
i ++; i++;
} }
} catch (Exception e) { } catch (Exception e) {
log.error("获取登录状态异常,",e); log.error("获取登录状态异常,", e);
deferredResult.setResult(new ResponseEntity(ResultUtil.error(ResultCode.ERROR), HttpStatus.OK)); deferredResult.setResult(new ResponseEntity<>(ResultUtil.error(ResultCode.ERROR), HttpStatus.OK));
Thread.currentThread().interrupt();
} }
}, Executors.newCachedThreadPool()); }, Executors.newCachedThreadPool());
return deferredResult; return deferredResult;
@ -111,9 +111,9 @@ public class MemberBuyerController {
@ApiImplicitParam(name = "code", value = "操作0拒绝登录1同意登录", required = true, paramType = "query") @ApiImplicitParam(name = "code", value = "操作0拒绝登录1同意登录", required = true, paramType = "query")
}) })
@PostMapping(value = "/app_confirm", produces = "application/json;charset=UTF-8") @PostMapping(value = "/app_confirm", produces = "application/json;charset=UTF-8")
public ResultMessage<Object> appSConfirm(String token,Integer code) { public ResultMessage<Object> appSConfirm(String token, Integer code) {
boolean flag = memberService.appSConfirm(token,code); boolean flag = memberService.appSConfirm(token, code);
return flag ? ResultUtil.success():ResultUtil.error(ResultCode.ERROR); return flag ? ResultUtil.success() : ResultUtil.error(ResultCode.ERROR);
} }

View File

@ -17,7 +17,10 @@ import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token; import cn.lili.common.security.token.Token;
import cn.lili.common.sensitive.SensitiveWordsFilter; import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.*; import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.UuidUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.config.ConnectAuthEnum;
import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.Connect;
@ -30,8 +33,8 @@ import cn.lili.modules.member.entity.enums.PointTypeEnum;
import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum; import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum;
import cn.lili.modules.member.entity.vo.MemberSearchVO; import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO; import cn.lili.modules.member.entity.vo.MemberVO;
import cn.lili.modules.member.entity.vo.QRLoginResultVo;
import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo; import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo;
import cn.lili.modules.member.entity.vo.QRLoginResultVo;
import cn.lili.modules.member.mapper.MemberMapper; import cn.lili.modules.member.mapper.MemberMapper;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.member.token.MemberTokenGenerate; import cn.lili.modules.member.token.MemberTokenGenerate;
@ -53,7 +56,10 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -210,6 +216,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
} }
@Override @Override
@Transactional
public Token autoRegister() { public Token autoRegister() {
ConnectAuthUser connectAuthUser = this.checkConnectUser(); ConnectAuthUser connectAuthUser = this.checkConnectUser();
return this.autoRegister(connectAuthUser); return this.autoRegister(connectAuthUser);
@ -404,11 +411,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
@Override @Override
public Member updateMember(ManagerMemberEditDTO managerMemberEditDTO) { public Member updateMember(ManagerMemberEditDTO managerMemberEditDTO) {
//过滤会员昵称敏感词 //过滤会员昵称敏感词
if (StringUtils.isNotBlank(managerMemberEditDTO.getNickName())) { if (CharSequenceUtil.isNotBlank(managerMemberEditDTO.getNickName())) {
managerMemberEditDTO.setNickName(SensitiveWordsFilter.filter(managerMemberEditDTO.getNickName())); managerMemberEditDTO.setNickName(SensitiveWordsFilter.filter(managerMemberEditDTO.getNickName()));
} }
//如果密码不为空则加密密码 //如果密码不为空则加密密码
if (StringUtils.isNotBlank(managerMemberEditDTO.getPassword())) { if (CharSequenceUtil.isNotBlank(managerMemberEditDTO.getPassword())) {
managerMemberEditDTO.setPassword(new BCryptPasswordEncoder().encode(managerMemberEditDTO.getPassword())); managerMemberEditDTO.setPassword(new BCryptPasswordEncoder().encode(managerMemberEditDTO.getPassword()));
} }
//查询会员信息 //查询会员信息
@ -676,11 +683,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
QRCodeLoginSessionVo session = new QRCodeLoginSessionVo(); QRCodeLoginSessionVo session = new QRCodeLoginSessionVo();
session.setStatus(QRCodeLoginSessionStatusEnum.WAIT_SCANNING.getCode()); session.setStatus(QRCodeLoginSessionStatusEnum.WAIT_SCANNING.getCode());
//过期时间20s //过期时间20s
Long duration= 20 * 1000L; Long duration = 20 * 1000L;
session.setDuration(duration); session.setDuration(duration);
String token = CachePrefix.QR_CODE_LOGIN_SESSION.name()+SnowFlake.getIdStr(); String token = CachePrefix.QR_CODE_LOGIN_SESSION.name() + SnowFlake.getIdStr();
session.setToken(token); session.setToken(token);
cache.put(token,session,duration, TimeUnit.MILLISECONDS); cache.put(token, session, duration, TimeUnit.MILLISECONDS);
return session; return session;
} }
@ -691,11 +698,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
throw new ServiceException(ResultCode.USER_NOT_LOGIN); throw new ServiceException(ResultCode.USER_NOT_LOGIN);
} }
QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(token); QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(token);
if(session == null){ if (session == null) {
return QRCodeLoginSessionStatusEnum.NO_EXIST.getCode(); return QRCodeLoginSessionStatusEnum.NO_EXIST.getCode();
} }
session.setStatus(QRCodeLoginSessionStatusEnum.SCANNING.getCode()); session.setStatus(QRCodeLoginSessionStatusEnum.SCANNING.getCode());
cache.put(token,session,session.getDuration(), TimeUnit.MILLISECONDS); cache.put(token, session, session.getDuration(), TimeUnit.MILLISECONDS);
return QRCodeLoginSessionStatusEnum.SCANNING.getCode(); return QRCodeLoginSessionStatusEnum.SCANNING.getCode();
} }
@ -706,18 +713,18 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
throw new ServiceException(ResultCode.USER_NOT_LOGIN); throw new ServiceException(ResultCode.USER_NOT_LOGIN);
} }
QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(token); QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(token);
if(session == null){ if (session == null) {
return false; return false;
} }
if(code==1){ if (code == 1) {
//同意 //同意
session.setStatus(QRCodeLoginSessionStatusEnum.VERIFIED.getCode()); session.setStatus(QRCodeLoginSessionStatusEnum.VERIFIED.getCode());
session.setUserId(Long.valueOf(tokenUser.getId())); session.setUserId(Long.parseLong(tokenUser.getId()));
}else{ } else {
//拒绝 //拒绝
session.setStatus(QRCodeLoginSessionStatusEnum.CANCELED.getCode()); session.setStatus(QRCodeLoginSessionStatusEnum.CANCELED.getCode());
} }
cache.put(token,session,session.getDuration(), TimeUnit.MILLISECONDS); cache.put(token, session, session.getDuration(), TimeUnit.MILLISECONDS);
return true; return true;
} }
@ -726,16 +733,16 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
QRLoginResultVo result = new QRLoginResultVo(); QRLoginResultVo result = new QRLoginResultVo();
result.setStatus(QRCodeLoginSessionStatusEnum.NO_EXIST.getCode()); result.setStatus(QRCodeLoginSessionStatusEnum.NO_EXIST.getCode());
QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(sessionToken); QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(sessionToken);
if(session == null){ if (session == null) {
return result; return result;
} }
result.setStatus(session.getStatus()); result.setStatus(session.getStatus());
if(QRCodeLoginSessionStatusEnum.VERIFIED.getCode().equals(session.getStatus())){ if (QRCodeLoginSessionStatusEnum.VERIFIED.getCode().equals(session.getStatus())) {
//生成token //生成token
Member member = this.getById(session.getUserId()); Member member = this.getById(session.getUserId());
if(member==null){ if (member == null) {
throw new ServiceException(ResultCode.USER_NOT_EXIST); throw new ServiceException(ResultCode.USER_NOT_EXIST);
}else{ } else {
//生成token //生成token
Token token = memberTokenGenerate.createToken(member, false); Token token = memberTokenGenerate.createToken(member, false);
result.setToken(token); result.setToken(token);