|
@@ -19,6 +19,7 @@ import org.springframework.stereotype.Component;
|
|
|
import javax.websocket.*;
|
|
|
import javax.websocket.server.PathParam;
|
|
|
import javax.websocket.server.ServerEndpoint;
|
|
|
+import java.io.EOFException;
|
|
|
import java.lang.annotation.Annotation;
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.util.List;
|
|
@@ -59,8 +60,17 @@ public class WebSocketServerEndpoint {
|
|
|
this.sessionId = UUID.randomUUID().toString().replace("-", "");
|
|
|
ThreadContext.put("TRACE_ID", sessionId);
|
|
|
|
|
|
- if (LOG.isInfoEnabled()) {
|
|
|
- LOG.info("[onOpen] into... path={} curSessionSize={}", path, amount);
|
|
|
+ String key = getRequestParameter(session, "key");
|
|
|
+ String token = getRequestParameter(session, "token");
|
|
|
+ if (StringUtils.isBlank(key)) {
|
|
|
+ LOG.warn("[onOpen] refused... path={}, user key is empty", path);
|
|
|
+ IOUtils.closeQuietly(session);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(token)) {
|
|
|
+ LOG.warn("[onOpen] refused... path={}, user token is empty", path);
|
|
|
+ IOUtils.closeQuietly(session);
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
MessageOut out = new MessageOut(path, sessionId);
|
|
@@ -68,35 +78,28 @@ public class WebSocketServerEndpoint {
|
|
|
|
|
|
Method method = MessageHandlerHolder.getMethod(path);
|
|
|
if (null == method) {
|
|
|
- out.setStatus("404", "NOT FOUND");
|
|
|
- WebSocketHelper.sendText(session, path, out);
|
|
|
- IOUtils.closeQuietly(session);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- String key = getRequestParameter(session, "key");
|
|
|
- String token = getRequestParameter(session, "token");
|
|
|
+ LOG.warn("[onOpen] refused... user={} path={}, 404 not found", key, path);
|
|
|
|
|
|
- if (StringUtils.isBlank(key)) {
|
|
|
- LOG.error("[onOpen-FAIL]. path=" + path + ". key is blank");
|
|
|
- IOUtils.closeQuietly(session);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (StringUtils.isBlank(token)) {
|
|
|
- LOG.error("[onOpen-FAIL]. path=" + path + ". token is blank");
|
|
|
+ out.setStatus("404", "not found");
|
|
|
+ WebSocketHelper.sendText(session, path, out);
|
|
|
IOUtils.closeQuietly(session);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
User user = getRedisClient().get(key, User.class);
|
|
|
-
|
|
|
if (null == user) {
|
|
|
+ LOG.warn("[onOpen] refused... user={} path={}, 403 no login", key, path);
|
|
|
+
|
|
|
out.setStatus("403", "no login");
|
|
|
WebSocketHelper.sendText(session, path, out);
|
|
|
IOUtils.closeQuietly(session);
|
|
|
return;
|
|
|
- } else if (!token.equals(user.getToken())) {
|
|
|
- out.setStatus("403", "token is wrong");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!token.equals(user.getToken())) {
|
|
|
+ LOG.warn("[onOpen] refused... user={} path={}, 403 token invalid", key, path);
|
|
|
+
|
|
|
+ out.setStatus("403", "token invalid");
|
|
|
WebSocketHelper.sendText(session, path, out);
|
|
|
IOUtils.closeQuietly(session);
|
|
|
return;
|
|
@@ -105,7 +108,7 @@ public class WebSocketServerEndpoint {
|
|
|
ThreadContext.put("CALLER", user.getKey());
|
|
|
|
|
|
if (LOG.isInfoEnabled()) {
|
|
|
- LOG.info("[onOpen] sendText... path={} curSessionSize={} user={}", path, amount, user.getKey());
|
|
|
+ LOG.info("[onOpen] into... user={} path={} wsSessionSize={}", key, path, amount);
|
|
|
}
|
|
|
|
|
|
WebSocketHelper.sendText(session, path, out);
|
|
@@ -128,26 +131,27 @@ public class WebSocketServerEndpoint {
|
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
|
return null;
|
|
|
}
|
|
|
- String value = StringUtils.join(list, ",");
|
|
|
- return value;
|
|
|
+
|
|
|
+ return StringUtils.join(list, ",");
|
|
|
}
|
|
|
|
|
|
@OnClose
|
|
|
public void onClose(Session session, @PathParam("path") String path) {
|
|
|
long amount = counter.decrementAndGet();
|
|
|
|
|
|
- String user = "";
|
|
|
+ String user = "unknown";
|
|
|
SessionInfo sessionInfo = WebSocketHelper.getSessionInfo(session);
|
|
|
if (null != sessionInfo) {
|
|
|
user = sessionInfo.getUser().getKey();
|
|
|
ThreadContext.put("TRACE_ID", sessionInfo.getSessionId());
|
|
|
ThreadContext.put("CALLER", user);
|
|
|
} else {
|
|
|
+ // 临时会话
|
|
|
ThreadContext.put("TRACE_ID", this.sessionId);
|
|
|
}
|
|
|
|
|
|
if (LOG.isInfoEnabled()) {
|
|
|
- LOG.info("[onClose] path={} curSessionSize={} user={}", path, amount, user);
|
|
|
+ LOG.info("[onClose] user={} path={} wsSessionSize={}", user, path, amount);
|
|
|
}
|
|
|
|
|
|
WebSocketHelper.closeSession(session);
|
|
@@ -155,45 +159,46 @@ public class WebSocketServerEndpoint {
|
|
|
|
|
|
@OnMessage
|
|
|
public void onMessage(Session session, @PathParam("path") String path, String message) {
|
|
|
-
|
|
|
SessionInfo sessionInfo = WebSocketHelper.getSessionInfo(session);
|
|
|
+ String userKey = sessionInfo.getUser().getKey();
|
|
|
ThreadContext.put("TRACE_ID", sessionInfo.getSessionId());
|
|
|
- ThreadContext.put("CALLER", sessionInfo.getUser().getKey());
|
|
|
+ ThreadContext.put("CALLER", userKey);
|
|
|
|
|
|
MessageOut out = new MessageOut(path, sessionInfo.getSessionId());
|
|
|
try {
|
|
|
JsonElement jsonEl = JsonParser.parseString(message);
|
|
|
message = JsonUtil.toJson(jsonEl);
|
|
|
} catch (JsonSyntaxException e) {
|
|
|
- out.setStatus("500", "message is not a json string");
|
|
|
+ LOG.warn("[onMessage] fail... user={} path={}, 500 message invalid: {}", userKey, path, message);
|
|
|
+
|
|
|
+ out.setStatus("500", "message invalid");
|
|
|
WebSocketHelper.sendText(session, path, out);
|
|
|
IOUtils.closeQuietly(session);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (LOG.isInfoEnabled()) {
|
|
|
- LOG.info("[onMessage] path={} user={}", path, sessionInfo.getUser().getKey());
|
|
|
- }
|
|
|
-
|
|
|
- SessionInfo si = WebSocketHelper.getSessionInfo(session);
|
|
|
-
|
|
|
- User user = getRedisClient().get(si.getUser().getKey(), User.class);
|
|
|
-
|
|
|
+ User user = getRedisClient().get(userKey, User.class);
|
|
|
if (null == user) {
|
|
|
+ LOG.warn("[onMessage] fail... user={} path={}, 403 token invalid", userKey, path);
|
|
|
+
|
|
|
out.setStatus("403", "no login");
|
|
|
WebSocketHelper.sendText(session, path, out);
|
|
|
IOUtils.closeQuietly(session);
|
|
|
return;
|
|
|
- } else if (!si.getUser().getToken().equals(user.getToken())) {
|
|
|
- out.setStatus("403", "token is wrong");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!sessionInfo.getUser().getToken().equals(user.getToken())) {
|
|
|
+ LOG.warn("[onMessage] fail... user={} path={}, 403 token invalid", userKey, path);
|
|
|
+
|
|
|
+ out.setStatus("403", "token invalid");
|
|
|
WebSocketHelper.sendText(session, path, out);
|
|
|
IOUtils.closeQuietly(session);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ boolean hasErr = false;
|
|
|
Object result = null;
|
|
|
try {
|
|
|
-
|
|
|
Method method = MessageHandlerHolder.getMethod(path);
|
|
|
Object bean = MessageHandlerHolder.getBean(path);
|
|
|
|
|
@@ -221,7 +226,7 @@ public class WebSocketServerEndpoint {
|
|
|
try {
|
|
|
args[i] = JsonUtil.fromJson(message, curType);
|
|
|
} catch (Exception e) {
|
|
|
- throw new StatusException("500", "fail to parse message to object");
|
|
|
+ throw new StatusException("500", "message parse fail...");
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
@@ -234,31 +239,50 @@ public class WebSocketServerEndpoint {
|
|
|
result = method.invoke(bean, args);
|
|
|
|
|
|
out.setContent(result);
|
|
|
-
|
|
|
} catch (StatusException e) {
|
|
|
- LOG.error("[onMessage-FAIL]. path=" + path + "", e);
|
|
|
+ LOG.error("[onMessage] error... user={} path={}", userKey, path, e);
|
|
|
out.setStatus(e.getCode(), e.getDesc());
|
|
|
+ hasErr = true;
|
|
|
} catch (Exception e) {
|
|
|
- LOG.error("[onMessage-FAIL]. path=" + path + "", e);
|
|
|
+ LOG.error("[onMessage] error... user={} path={}", userKey, path, e);
|
|
|
out.setStatus("500", "系统异常");
|
|
|
+ hasErr = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (LOG.isInfoEnabled() && !hasErr) {
|
|
|
+ if (result != null) {
|
|
|
+ LOG.info("[onMessage] user={} path={} content={}", userKey, path, result);
|
|
|
+ } else {
|
|
|
+ LOG.info("[onMessage] user={} path={}", userKey, path);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
WebSocketHelper.sendText(session, path, out);
|
|
|
}
|
|
|
|
|
|
@OnError
|
|
|
- public void onError(Session session, @PathParam("path") String path, Throwable t) {
|
|
|
- String user = "";
|
|
|
+ public void onError(Session session, @PathParam("path") String path, Throwable err) {
|
|
|
+ String user = "unknown";
|
|
|
SessionInfo sessionInfo = WebSocketHelper.getSessionInfo(session);
|
|
|
if (null != sessionInfo) {
|
|
|
user = sessionInfo.getUser().getKey();
|
|
|
ThreadContext.put("TRACE_ID", sessionInfo.getSessionId());
|
|
|
ThreadContext.put("CALLER", user);
|
|
|
} else {
|
|
|
+ // 临时会话
|
|
|
ThreadContext.put("TRACE_ID", this.sessionId);
|
|
|
}
|
|
|
|
|
|
- LOG.error("[onError] path={} user={} ", path, user, t);
|
|
|
+ if (err != null) {
|
|
|
+ if (err instanceof EOFException) {
|
|
|
+ // WebSocket 默认60秒内无心跳会关闭连接
|
|
|
+ LOG.error("[onError] user={} path={}, cause = connection closed, EOFException...", user, path);
|
|
|
+ } else {
|
|
|
+ LOG.error("[onError] user={} path={}", user, path, err);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LOG.error("[onError] user={} path={}, no err msg...", user, path);
|
|
|
+ }
|
|
|
|
|
|
WebSocketHelper.closeSession(session);
|
|
|
}
|