一个非常重要的地方。WebSocketSession和HttpSession对象是不是一个东西。
Topic source还有一个点。建立连接以后放了一个name字段到Attributes里面,这里是放到哪个session里面了呢,是直接放到websocketSession还是执行getAttributes()方法时去找HttpSession,然后放到他里面??大家可以自己测一下😊
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String name = null;
User user = (User) session.getAttributes().get("user");
if (user != null) {
name = user.getName();
} else {
name = "Guest " + atomicInteger.incrementAndGet();
}
session.getAttributes().put("name", name);
}
- 1
Loading...
一开始我以为WebSocketSession和Session是差不多的东西。而且我并没有执行这段代码,关闭连接。大家也可以试一下注释掉这段代码。
然后建立websocket连接后刷新浏览器。就会报错
按理说我没有关闭浏览器,在这段代码里。即使我刷新一下浏览器,也不应该产生新session,这里拿到的sessionId应该是一样的。
但是神奇的事情发生了,刷新浏览器两次拿到的sessionId并不一样。每次刷新浏览器websocket维护了一个新session
和HttpSession完全是两码事。
每次刷新浏览器websocket都会执行afterConnectionClosed方法,而我在这段代码里把清除当前sessioin的代码注释掉了。
刷新后再进来ConcurrentHashMap里面还维护着那个session,但是那个session已经被关闭了。广播时就会报错
还有一个重要的点。老师这里用了ConcurrentHashMap。ConcurrentHashMap可以保证线程安全(多个线程操作同一个Segment,则某个线程给此Segment加锁,另一个线程只能阻塞)。也就是当多个用户同时进来的时候就要一个个put到map里。
还有历史记录和用户登录没搞,回头再看发现到处都是细节。而且这还只是用spring整合的websocket,原生java如何实现??continue...