验证 TOKEN

This commit is contained in:
Chopper711 2024-05-10 17:04:32 +08:00
parent 88ab071ac7
commit 2463d1b5bb

View File

@ -1,6 +1,7 @@
package cn.lili.controller.im; package cn.lili.controller.im;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.cache.Cache;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
@ -15,18 +16,21 @@ import cn.lili.modules.im.service.ImTalkService;
import com.alibaba.druid.util.StringUtils; import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* @author liushuai * @author liushuai
*/ */
@ -36,19 +40,16 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j @Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WebSocketServer { public class WebSocketServer {
/**
* 在线人数 PS 注意只能单节点如果多节点部署需要自行寻找方案
*/
private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
/** /**
* 消息服务 * 消息服务
*/ */
private final ImMessageService imMessageService; private final ImMessageService imMessageService;
private final ImTalkService imTalkService; private final ImTalkService imTalkService;
private final Cache cache;
/**
* 在线人数
* PS 注意只能单节点如果多节点部署需要自行寻找方案
*/
private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
/** /**
* 建立连接 * 建立连接
@ -58,15 +59,15 @@ public class WebSocketServer {
@OnOpen @OnOpen
public void onOpen(@PathParam("accessToken") String accessToken, Session session) { public void onOpen(@PathParam("accessToken") String accessToken, Session session) {
AuthUser authUser = UserContext.getAuthUser(cache, accessToken);
AuthUser authUser = UserContext.getAuthUser(accessToken);
String sessionId = UserEnums.STORE.equals(authUser.getRole()) ? authUser.getStoreId() : authUser.getId(); String sessionId = UserEnums.STORE.equals(authUser.getRole()) ? authUser.getStoreId() : authUser.getId();
//如果已有会话则进行下线提醒 //如果已有会话则进行下线提醒
if (sessionPools.containsKey(sessionId)) { if (sessionPools.containsKey(sessionId)) {
log.info("用户重复登陆,旧用户下线"); log.info("用户重复登陆,旧用户下线");
Session oldSession = sessionPools.get(sessionId); Session oldSession = sessionPools.get(sessionId);
sendMessage(oldSession, MessageVO.builder().messageResultType(MessageResultType.OFFLINE).result("用户异地登陆").build()); sendMessage(oldSession,
MessageVO.builder().messageResultType(MessageResultType.OFFLINE).result("用户异地登陆").build());
try { try {
oldSession.close(); oldSession.close();
} catch (Exception e) { } catch (Exception e) {
@ -116,7 +117,8 @@ public class WebSocketServer {
ImMessage imMessage = new ImMessage(messageOperation); ImMessage imMessage = new ImMessage(messageOperation);
imMessageService.save(imMessage); imMessageService.save(imMessage);
//修改最后消息信息 //修改最后消息信息
imTalkService.update(new LambdaUpdateWrapper<ImTalk>().eq(ImTalk::getId, messageOperation.getTalkId()).set(ImTalk::getLastTalkMessage, messageOperation.getContext()) imTalkService.update(new LambdaUpdateWrapper<ImTalk>().eq(ImTalk::getId, messageOperation.getTalkId())
.set(ImTalk::getLastTalkMessage, messageOperation.getContext())
.set(ImTalk::getLastTalkTime, imMessage.getCreateTime()) .set(ImTalk::getLastTalkTime, imMessage.getCreateTime())
.set(ImTalk::getLastMessageType, imMessage.getMessageType())); .set(ImTalk::getLastMessageType, imMessage.getMessageType()));
//发送消息 //发送消息
@ -128,10 +130,12 @@ public class WebSocketServer {
} }
break; break;
case UNREAD: case UNREAD:
sendMessage(authUser.getId(), new MessageVO(MessageResultType.UN_READ, imMessageService.unReadMessages(accessToken))); sendMessage(authUser.getId(),
new MessageVO(MessageResultType.UN_READ, imMessageService.unReadMessages(accessToken)));
break; break;
case HISTORY: case HISTORY:
sendMessage(authUser.getId(), new MessageVO(MessageResultType.HISTORY, imMessageService.historyMessage(accessToken, messageOperation.getTo()))); sendMessage(authUser.getId(), new MessageVO(MessageResultType.HISTORY,
imMessageService.historyMessage(accessToken, messageOperation.getTo())));
break; break;
default: default:
break; break;
@ -176,5 +180,4 @@ public class WebSocketServer {
log.error("socket异常: {}", session.getId(), throwable); log.error("socket异常: {}", session.getId(), throwable);
} }
} }