|
@@ -0,0 +1,83 @@
|
|
|
+package com.ym.mec.teacher.interceptor;
|
|
|
+
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.messaging.Message;
|
|
|
+import org.springframework.messaging.MessageChannel;
|
|
|
+import org.springframework.messaging.simp.stomp.StompCommand;
|
|
|
+import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
|
|
|
+import org.springframework.messaging.support.ChannelInterceptor;
|
|
|
+import org.springframework.messaging.support.MessageHeaderAccessor;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.Optional;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Author Joburgess
|
|
|
+ * @Date 2021/6/15 0015
|
|
|
+ */
|
|
|
+public class WebSocketChannelInterceptor implements ChannelInterceptor {
|
|
|
+
|
|
|
+ private final Logger LOGGER = LoggerFactory.getLogger(WebSocketChannelInterceptor.class);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 在消息发送之前执行, 如果此方法返回值为空, 则不会发生实际的消息发送
|
|
|
+ * @param message 消息
|
|
|
+ * @param channel 通道
|
|
|
+ * @return 消息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Message<?> preSend(Message<?> message, MessageChannel channel) {
|
|
|
+ StompHeaderAccessor stompHeader = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
|
|
|
+ /*
|
|
|
+ * 判断是否首次连接请求, 如果已经连接, 返回message
|
|
|
+ */
|
|
|
+ if (StompCommand.CONNECT.equals(stompHeader.getCommand())) {//首次连接
|
|
|
+ List<String> tokens = stompHeader.getNativeHeader("Authorization");//获取TOKEN
|
|
|
+ LOGGER.info("preSend: stompHeader.getNativeHeader tokens --> {}", tokens);
|
|
|
+ String token = Optional.ofNullable(tokens).map(tokenList -> tokenList.get(0)).orElse(null);
|
|
|
+ LOGGER.info("preSend: token --> {}", token);
|
|
|
+ } else if (StompCommand.DISCONNECT.equals(stompHeader.getCommand())) {//断开连接
|
|
|
+ LOGGER.info("preSend: {} close connect", stompHeader.getUser());
|
|
|
+ }
|
|
|
+ return message;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 在消息被实际检索之前调用, 在WebSocket场景中应用不到
|
|
|
+ * @param channel 通道
|
|
|
+ * @return false: 不会检索任何消息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean preReceive(MessageChannel channel) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 在检索到消息之后, 返回调用方法之前调用, 可以进行消息修改, 如果返回null, 就不会执行下一步操作
|
|
|
+ * @param message 消息
|
|
|
+ * @param channel 通道
|
|
|
+ * @return 消息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Message<?> postReceive(Message<?> message, MessageChannel channel) {
|
|
|
+ return message;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 在消息发送后立刻调用
|
|
|
+ * @param message 消息
|
|
|
+ * @param channel 通道
|
|
|
+ * @param sent 表示调用的返回值
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
|
|
|
+ /*StompHeaderAccessor stompHeader = StompHeaderAccessor.wrap(message);
|
|
|
+ if (Objects.isNull(stompHeader.getCommand())) {//心跳消息
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("postSend -- command --> {}", stompHeader.getCommand());*/
|
|
|
+ }
|
|
|
+
|
|
|
+}
|