跨端点的 Java websockets 共享 session

标签 java javascript session websocket

我正在尝试找出一种组织 javax.websocket 的好方法我正在开发的多人纸牌游戏。

我想将我的代码分成多个类,每个类都是一个 ServerEndpoint .我的问题是我需要一种在它们之间共享 session 数据的有效方法。

我在“/index”处有一个索引,这是我当前正在创建的位置 Player客户的对象。我是这样设置的:

@ServerEndpoint("/index")
public class IndexEndpoint {

  @OnOpen
  public void openConnection(Session session) {
    session.getUserProperties().put("player", new Player());
  }

}

那行得通;我可以访问 Player整个其他地方的对象 IndexEndpoint .

但是当我尝试从另一个端点访问用户属性时(在 JavaScript 中与 IndexEndpoint 建立连接后,等待 5 秒,然后在同一页面上打开与 LobbyEndpoint 的附加连接),我得到null .

@ServerEndpoint("/lobby")
public class LobbyEndpoint {

  @OnOpen
  public void openConnection(Session session) {
    System.out.println(session.getUserProperties().get("player")); // prints null
  }

}

这让我暗示 session 数据不幸没有跨端点共享。

我有什么好的方法可以跨多个类共享 websocket session 数据吗?

我想一种解决方案是只为所有用户连接一个 über 端点,它可以处理任何消息类型。然后该端点将消息数据委托(delegate)给我的应用程序的其他部分。

但是我觉得这样的设计会非常困惑和限制。我希望端点专用于特定房间,使用像 @ServerEndpoint("/rooms/{room-id}") 这样的注释和 @PathParam("room-id") .因此,如果我使用的是整体端点,那么我就不能那样做;我无法知道连接用户是否是访问房间的用户。

最佳答案

包含所有玩家和游戏数据的单例 EJB 怎么样?

@Stateless
@ServerEndpoint("/lobby/{sessionKey}")
public class IndexEndpoint {

    @EJB
    GameData data;

    @OnOpen
    public void onOpen(Session session, EndpointConfig config,
            @PathParam("sessionKey") int id) {
        Player player = data.getPlayer(id);
        session.getUserProperties().put("player", player);
    }
}

来自 IndexEndpoint 的第一条消息可以向客户端提供其 ID,然后客户端可以将其 ID 提供给 ws URL 中的 LobbyEndpoint(或在带有配置器的 header 中),这就是我计划这样做的方式。

关于跨端点的 Java websockets 共享 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232614/

相关文章:

wordpress 获取当前用户的登录 session 数

java - 在 MySQL 的选择查询中将 VARBINARY 值转换为字符串?

java - Long.parseLong 错误

javascript - jquery Ajax 调用 - 数据参数未传递给 MVC Controller 操作

javascript - 如何使用 javascript 检查数字是否有 - 作为其起始值?

javascript - 将参数传递给函数,接收端显示未定义

node.js - 用于 Web 应用程序 JWT 的 Nodejs Express,带有数据库或 session 来对用户进行身份验证

java - 如何有效地将一个方法划分为子方法?

java - netbeans 中的企业应用程序项目中没有 web.xml

jsf - 如何使用应用程序上的新用户登录创建新 session ?