【问题标题】:Combining multiple WebSockets endpoints in Java EE 7在 Java EE 7 中组合多个 WebSockets 端点
【发布时间】:2015-11-30 14:15:53
【问题描述】:

我使用 GlassFish Server 4.1 / Java EE 7。因此,Tyrus WebSocket 实现开箱即用。

在 Java EE 应用程序中有一个场景,用户和管理员共同执行 CRUD 操作。 “插入”操作由注册用户执行,其余操作由管理员在需要时处理。

例如,注册用户(仅在登录后)提交反馈(因此,通过其关联的 JPA 实体 Feedback 插入)。 “更新”(基本上只有testimonials)和“删除”由管理员在需要时(在他自己的会话中)执行。

因此,这些操作在需要不同身份验证/授权的不同会话中执行。为此,需要两个不同的 WebSockets 端点,例如,

@ServerEndpoint("/Admin/Push")

和

@ServerEndpoint("/User/Push")

而不是使用两个不同的类,例如,

@ServerEndpoint("/Admin/Push") // This is a secured endpoint requiring admin's privileges.
public final class AdminPush {

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

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }

    @OnMessage
    public void onMessage(String text) {
        // Notify all users.
        // Since modifications to entities are done on the server side,
        // it is basically another synchronized static method notifying all users.
    }
}

和

@ServerEndpoint("/User/Push") // This is a secured endpoint requiring user's privileges.
public final class UserPush {

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

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }

    @OnMessage
    public void onMessage(String text) {
        // Notify all users.
        // Since modifications to entities are done on the server side,
        // it is basically another synchronized static method notifying all users.
    }
}

是否允许将它们组合成一个类,例如?

@ServerEndpoint("/Admin/Push")
@ServerEndpoint("/User/Push")
public final class Push {}

理论上,这只是一个想法,可以说明是否允许以这种想象的方式组合它们。实际上,这显然是一个编译时错误,因为@ServerEndpoint 不是可重复的注解。

在上述任何一种情况下,当管理员或用户在Feedback JPA 实体(通过 WebSockets 实时更新)中修改某些内容时,都会通知用户。 Feedback 对所有用户公开可用,包括匿名用户,但只能由注册用户提交(它也会定期更新,但这是另一回事)。

【问题讨论】:

  • 你有什么解决办法吗?我也想做类似的事情
  • @Teocci:遗憾的是没有。相反,我创建了单独的端点,如 sn-ps 所示。
  • 我在想,我最终得到了一个possible solution,如果有任何缺点请告诉我

标签: jakarta-ee websocket glassfish java-ee-7 glassfish-4.1


【解决方案1】:

也许,你可以这样做:

@ServerEndpoint("/{profile}/push")
public final class Push {}

或者从业务分离的角度,你应该创建一个或多个类来管理会话或常用操作,入口点类只需要调用这些常用方法。比如:

@ServerEndpoint("/admin/push")
public final class Admin {
    @OnOpen
    public void onOpen(Session session) {
        // Call session manager
    }
}

@ServerEndpoint("/user/push")
public final class User {
    @OnOpen
    public void onOpen(Session session) {
        // Call session manager
    }
}

public class SessionManager {
    // Your methods
}

只是一些想法。

【讨论】:

  • 第一种使用javax.websocket.server.PathParam 的方法不能使用,因为它可以允许路径参数中的任何内容。因此,任何用户都可以使用 JavaScript API 轻松地与该端点建立连接。 (如果允许指定的 URI 是动态的,则它不再安全)。
猜你喜欢
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2013-06-21
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多