Discuss / Java / 一个非常重要的地方。WebSocketSession和HttpSession对象是不是一个东西。

一个非常重要的地方。WebSocketSession和HttpSession对象是不是一个东西。

Topic source

Loading...

#1 Created at ... [Delete] [Delete and Lock User]

一开始我以为WebSocketSession和Session是差不多的东西。而且我并没有执行这段代码,关闭连接。大家也可以试一下注释掉这段代码。

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session.getId());
        logger.info("{} closed", session.getId());
    }

然后建立websocket连接后刷新浏览器。就会报错

The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session-ConcurrentHashMap

按理说我没有关闭浏览器,在这段代码里。即使我刷新一下浏览器,也不应该产生新session,这里拿到的sessionId应该是一样的。

    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        logger.info("{} established", session.getId());
        sessions.put(session.getId(), session);
}

但是神奇的事情发生了,刷新浏览器两次拿到的sessionId并不一样。每次刷新浏览器websocket维护了一个新session

和HttpSession完全是两码事。

每次刷新浏览器websocket都会执行afterConnectionClosed方法,而我在这段代码里把清除当前sessioin的代码注释掉了。

   @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        //sessions.remove(session.getId());
        logger.info("{} closed", session.getId());
    }

刷新后再进来ConcurrentHashMap里面还维护着那个session,但是那个session已经被关闭了。广播时就会报错

 The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session-ConcurrentHashMap

还有一个重要的点。老师这里用了ConcurrentHashMap。ConcurrentHashMap可以保证线程安全(多个线程操作同一个Segment,则某个线程给此Segment加锁,另一个线程只能阻塞)。也就是当多个用户同时进来的时候就要一个个put到map里。

    Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

还有历史记录和用户登录没搞,回头再看发现到处都是细节。而且这还只是用spring整合的websocket,原生java如何实现??continue...

Loading...

#2 Created at ... [Delete] [Delete and Lock User]

还有一个点。建立连接以后放了一个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);
    }

Loading...

#3 Created at ... [Delete] [Delete and Lock User]

还有几个bug没解决,保存发送历史记录,当前用户刷新页面后不产生新记录。


  • 1

Reply