一般我们在连接的时候,设置的key都是以httpSessionId来作为key保存到本地
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
if (log.isDebugEnabled()) {
log.debug("-------------websocket open--------------");
}
HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
String httpSessionId = httpSession.getId();
if (log.isDebugEnabled()) {
log.debug("httpSessionId:{}", httpSessionId);
}
SESSION_MAP.put(httpSessionId, session);
AjaxResult success = AjaxResult.success();
success.put("sessionId", httpSessionId);
}
但是就有可能有的浏览器限制了 httpSession是唯一的,这个时候我们拿到的key就是一致的,就会导致前面的连接会被后面的连接给“踢”掉。也就造成我们群发消息的时候,没有之前的会话;
解决:
改变本地存储会话的key?
(1) 可以用唯一值(UUID之类的)
(2) 设置key是session.getId()的值
通过测试发现,session 对象里,id是唯一的,那么就可以从此处着手
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
if (log.isDebugEnabled()) {
log.debug("-------------websocket open--------------");
}
String sessionId=session.getId();
log.info("连接成功,最新连接的sessionId SessionId:{}", sessionId);
SESSION_MAP.put(session.getId(), session);
AjaxResult success = AjaxResult.success();
success.put("sessionId", sessionId);
}
|