Java websocket 连接检查同一用户是否重新连接
Java websocket connection check if same user reconnects
在我的应用程序中,我有一个会话处理程序,它在连接时存储所有连接的会话,并在它们正确断开连接时删除它们。如果他们不这样做,我会保留会话,如果他们重新连接,我会用新会话替换旧会话。 (下面的代码看似愚蠢,但只是为了说明我的观点)
@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)
}
}
}
问题是:我如何检查会话是否针对之前连接的客户端,以便我可以用新打开的会话替换会话?
编辑:
这是必需的,因为我的客户端是一个 html5 应用程序,用户可以在其中 refresh/navigate 在页面上,然后连接丢失。每当他尝试重新连接时,我都想知道他目前正在玩哪个游戏。如果用户连接不稳定(即在手机上 phone),连接也会时不时丢失。
我无法对此进行足够可靠的检查,因此最终在连接时向客户端发送了一个唯一的字符串 (uuid)。如果客户端使用提供他旧 uuid 的查询参数连接,我将使用它来确定他是谁。我只相信客户是他所说的那个人,无论如何,如果使用这个 uuid 的旧会话断开连接,他只能连接到这个 uuid。
我根本没有考虑过安全性,如果我考虑过,我可能会使用类似 diffie hellman 密钥交换的东西,这样知道共享 uuid 的唯一两方就是服务器和客户端。
在我的应用程序中,我有一个会话处理程序,它在连接时存储所有连接的会话,并在它们正确断开连接时删除它们。如果他们不这样做,我会保留会话,如果他们重新连接,我会用新会话替换旧会话。 (下面的代码看似愚蠢,但只是为了说明我的观点)
@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)
}
}
}
问题是:我如何检查会话是否针对之前连接的客户端,以便我可以用新打开的会话替换会话?
编辑: 这是必需的,因为我的客户端是一个 html5 应用程序,用户可以在其中 refresh/navigate 在页面上,然后连接丢失。每当他尝试重新连接时,我都想知道他目前正在玩哪个游戏。如果用户连接不稳定(即在手机上 phone),连接也会时不时丢失。
我无法对此进行足够可靠的检查,因此最终在连接时向客户端发送了一个唯一的字符串 (uuid)。如果客户端使用提供他旧 uuid 的查询参数连接,我将使用它来确定他是谁。我只相信客户是他所说的那个人,无论如何,如果使用这个 uuid 的旧会话断开连接,他只能连接到这个 uuid。
我根本没有考虑过安全性,如果我考虑过,我可能会使用类似 diffie hellman 密钥交换的东西,这样知道共享 uuid 的唯一两方就是服务器和客户端。