fix: 优化扫描登录相关代码
This commit is contained in:
parent
3786c53cad
commit
3549b216b0
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user