yangyale 1 год назад
Родитель
Сommit
b594ca306f

+ 1 - 1
src/main/java/com/hy/common/web/domain/response/Result.java

@@ -106,7 +106,7 @@ public class Result<T> implements Serializable {
      * 失 败 操 作, 携 带 自 定 义 状 态 码 和 自 定 义 消 息
      */
     public static <T> Result<T> failure(int code, String message) {
-        return failure(ResultCode.FAILURE.getCode(), message, null);
+        return failure(code, message, null);
     }
 
     /**

+ 6 - 1
src/main/java/com/hy/modules/bz/config/WebSocketConfig.java

@@ -1,6 +1,8 @@
 package com.hy.modules.bz.config;
 
 import com.hy.modules.bz.websocket.BarrageWebSocketServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.socket.config.annotation.EnableWebSocket;
@@ -13,9 +15,12 @@ import static com.hy.modules.bz.websocket.BarrageWebSocketServer.PATH;
 @EnableWebSocket
 public class WebSocketConfig implements WebSocketConfigurer {
 
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
     @Override
     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
-        registry.addHandler(barrageWebSocketServer(),PATH);
+        registry.addHandler(barrageWebSocketServer(),PATH).setAllowedOrigins("*");
+        logger.info("BarrageWebSocketServer inited.");
     }
 
     @Bean

+ 37 - 0
src/main/java/com/hy/modules/bz/exception/BzException.java

@@ -0,0 +1,37 @@
+package com.hy.modules.bz.exception;
+
+import com.hy.modules.bz.webapi.ErrorCode;
+
+public class BzException extends RuntimeException{
+
+    private ErrorCode errorCode;
+
+    public BzException(ErrorCode errorCode) {
+        super(errorCode.getErrorMsg());
+        this.errorCode = errorCode;
+    }
+
+    public BzException(String message, ErrorCode errorCode) {
+        super(message);
+        this.errorCode = errorCode;
+    }
+
+    public BzException(String message, Throwable cause, ErrorCode errorCode) {
+        super(message, cause);
+        this.errorCode = errorCode;
+    }
+
+    public BzException(Throwable cause, ErrorCode errorCode) {
+        super(errorCode.getErrorMsg(),cause);
+        this.errorCode = errorCode;
+    }
+
+    public BzException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, ErrorCode errorCode) {
+        super(message, cause, enableSuppression, writableStackTrace);
+        this.errorCode = errorCode;
+    }
+
+    public ErrorCode getErrorCode() {
+        return errorCode;
+    }
+}

+ 9 - 3
src/main/java/com/hy/modules/bz/webapi/ErrorCode.java

@@ -1,13 +1,19 @@
 package com.hy.modules.bz.webapi;
 
 public enum ErrorCode {
+    /**
+     * HTTP requset 专属
+     */
     NO_PLAYER_FOUND(300,"账号不存在或密码错误!"),
-
     TOKEN_EXPIRED(301,"token已过期,请重新登录!"),
 
+    /**
+     * websocket 专属
+     */
+    TOKEN_INVALID(302,"token无效,数据被篡改,请重试!"),
     ;
-    private int code;
-    private String errorMsg;
+    private final int code;
+    private final String errorMsg;
 
     ErrorCode(int code, String errorMsg) {
         this.code = code;

+ 38 - 9
src/main/java/com/hy/modules/bz/websocket/BarrageWebSocketServer.java

@@ -2,23 +2,29 @@ package com.hy.modules.bz.websocket;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.hy.common.web.domain.response.Result;
 import com.hy.common.websocket.AbstractWebSocketServer;
 import com.hy.modules.bz.domain.BzAnchorStudio;
 import com.hy.modules.bz.domain.BzGiftRecord;
+import com.hy.modules.bz.exception.BzException;
 import com.hy.modules.bz.service.IBzAnchorStudioService;
 import com.hy.modules.bz.service.IBzGiftRecordService;
 import com.hy.modules.bz.utils.TokenStatusManager;
+import com.hy.modules.bz.webapi.ErrorCode;
 import com.hy.modules.bz.websocket.message.GiftMessage;
 import com.hy.modules.bz.websocket.message.MessageType;
 import com.hy.modules.sys.domain.SysDictData;
 import com.hy.modules.sys.service.SysDictDataService;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.web.socket.TextMessage;
 import org.springframework.web.socket.WebSocketSession;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -69,7 +75,6 @@ public class BarrageWebSocketServer extends AbstractWebSocketServer {
                 }
             }
         },reconnectTime, TimeUnit.SECONDS);
-
     }
 
     @Override
@@ -77,15 +82,35 @@ public class BarrageWebSocketServer extends AbstractWebSocketServer {
         JSONObject object = JSON.parseObject(message);
 
         if(MessageType.GiftMessage.equals(MessageType.getMessageType(object.getString(MESSAGE_TYPE_CODE)))){
-            // 暂时只处理礼物消息
-            GiftMessage giftMessage = JSON.parseObject(message, GiftMessage.class);
-            if(!session.getAttributes().containsKey(TOKEN_PRIFIX)){
-                session.getAttributes().put(TOKEN_PRIFIX, giftMessage.getToken());
-            }
-            saveGiftRecord(giftMessage);
-        }
+            try{
+                // 暂时只处理礼物消息
+                GiftMessage giftMessage = JSON.parseObject(message, GiftMessage.class);
+                if(StringUtils.isBlank(giftMessage.getToken())){
+                    throw new BzException(ErrorCode.TOKEN_INVALID);
+                }
+                if(!session.getAttributes().containsKey(TOKEN_PRIFIX)){
+                    // 只有在第一次消息过来的时候发现没有token,此时会设置token
+                    session.getAttributes().put(TOKEN_PRIFIX, giftMessage.getToken());
+                }
 
+                saveGiftRecord(giftMessage);
+            }catch (BzException ex){
+                // 捕获异常时发送消息
+                try {
+                    session.sendMessage(new TextMessage(JSON.toJSONString(Result.failure(ex.getErrorCode().getCode(),ex.getMessage()))));
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }catch (Exception ex){
+                try {
+                    session.sendMessage(new TextMessage(JSON.toJSONString(Result.failure(500,ex.getMessage()))));
+                    throw new RuntimeException(ex);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
 
+        }
     }
 
     private BigDecimal getGiftScore(String giftName) throws RuntimeException{
@@ -101,8 +126,12 @@ public class BarrageWebSocketServer extends AbstractWebSocketServer {
     }
 
     private void saveGiftRecord(GiftMessage giftMessage){
-        BigDecimal score = getGiftScore(giftMessage.getGiftName());
         BzAnchorStudio anchorStudio = anchorStudioService.getByRoomId(giftMessage.getToken());
+        if(null == anchorStudio){
+            throw new BzException(ErrorCode.TOKEN_INVALID);
+        }
+
+        BigDecimal score = getGiftScore(giftMessage.getGiftName());
         BzGiftRecord giftRecord = new BzGiftRecord();
         giftRecord.setAnchorCode(anchorStudio.getCode());
         giftRecord.setAnchorId(anchorStudio.getAnchorId());

+ 1 - 0
src/main/resources/application.yml

@@ -71,6 +71,7 @@ hy:
     open-api:
       - /login/**  # 开放登录接口
       - /bz/api/** # 开放接口
+      - /barrage/** #开放websocket path
       - /system/captcha/** # 开放验证码接口
       - /assets/** # 开放静态资源
       - /admin/** # 开放静态资源