Java websocket连接检查同一用户是否重新连接

标签 java reconnect java-websocket jsr356

在我的应用程序中,我有一个 session 处理程序,它在连接时存储所有连接的 session ,并在它们正确断开连接时删除它们。如果他们不这样做,我会保留 session ,如果他们重新连接,我会用新 session 替换旧 session 。 (下面的代码看起来很愚蠢,但这只是为了表明我的观点)

@ServerEndpoint(value = "/games")
public class GameEndPoint {

    @Inject
    private GameSessionHandler sessionHandler;

    @OnOpen
    public void open(Session session) {
        sessionHandler.addSession(session);
    }

    @OnClose
    public void close(Session session, CloseReason closeReason) {
        sessionHandler.sessionClosed(session, closeReason.getCloseCode());
    }

    @OnError
    public void onError(Throwable error) {
        LOGGER.log(Level.SEVERE, "Socket connection error", error);
    }

    @OnMessage
    public String handleMessage(String payload, Session session) {
        return payload;
    }
}

@Singleton
public class GameSessionHandler implements Serializable {

    private final Set<Session> sessions = new HashSet<>();

    public void addSession(Session session) {
        for(Session existing: sessions) {
            if(existing.equals(session)) {//DOES NOT WORK
                //client reconnected!
                sessions.remove(existing);
                break;
            }
        }
        sessions.add(session);
    }

    public void removeSession(Session session) {
        if (CloseReason.CloseCodes.NORMAL_CLOSURE.equals(reason)) {
            sessions.remove(session)
        }
    }
}

问题是:如何检查该 session 是否适用于之前连接的客户端,以便我可以用新打开的 session 替换该 session ?

编辑: 这是必需的,因为我的客户端是一个 html5 应用程序,用户可以在页面上刷新/导航,然后连接就会丢失。每当他尝试重新连接时,我都想知道他当前正在玩哪个游戏。如果用户的连接不稳定(即在手机上),连接也会不时丢失。

最佳答案

我无法对此进行足够可靠的检查,因此最终在连接时向客户端发送了一个唯一的字符串(uuid)。如果客户端连接的查询参数给出了他的旧 uuid,我用它来找出他是谁。我只是相信客户端就是他所说的那个人,无论如何,如果与此 uuid 的旧 session 已断开连接,他只能与此 uuid 连接。

我根本没有考虑过安全性,如果有的话,我可能应该使用 diffie hellman key 交换之类的东西,所以知道共享 uuid 的唯一两方是服务器和客户端。

关于Java websocket连接检查同一用户是否重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34992727/

相关文章:

java - 替代 Java.sql.time

node.js - 在 socket.io 重新连接时更新查询字符串参数

Java Spring-boot - 如何将@Autowired 与@ServerEndpoint 一起使用?

java - JAX-RS : Suppress Error Message

java - 尝试重复直到条件为假

java - influxdb失败导致spring应用程序运行失败

javascript - 在 Java 上编写 WebSocket 服务器。 Windows 7 64 位上的问题

spring - Stomp.js 已过时且不再维护 - 哪个 Stomp 客户端与 Spring Websockets 一起使用?

java - 在排序列表中找到最近/最接近的值