1

我正在使用 websockets 将有关资源的信息从服务器传递到客户端。websocket Endpoint 使用路径参数来标识特定资源。例如:

@ServerEndpoint("/resources/{resource-id}/updates")

onOpenEndpoint 类在其方法中具有以下逻辑:

@OnOpen
public void onOpen(@PathParam("resource-id")int resourceId, Session session) throws IOException {
     boolean resourceExists = checkIfResourceExists(resourceId);
     if (!resourceExists) {
         // what should I do here?
     }
}

使用 AJAX 长轮询时,如果资源不存在,我会发送 404 响应。然后客户就会知道不要再试了。是否有用于 websockets 的等效技术?我的两个想法是:

  1. if (!resourceExists)在上面的块中使用以下代码:

    session.close(new CloseReason(CUSTOM_NOT_FOUND_CODE, "Resource ID not found")); return;

    CUSTOM_NOT_FOUND_CODE4000-4999 范围内的 CloseCode 在哪里。

  2. 在此端点的实现中的某处执行此逻辑,ServerEndpointConfig.Configurator并在连接升级发生之前返回 404。这听起来对我来说是最好的方法,但似乎没有任何方法可以从该modifyHandshake方法发送标准的 HTTP 错误响应。

  3. 在过滤器中执行此逻辑。但是,这里的问题是,如果我在过滤器中加载资源,我如何将它传递给端点?使用 HTTP 请求,我可以在过滤器中添加请求属性,然后在 servlet 中可用。但是似乎没有一种简单的方法可以使用 websockets 实现相同的目标。当然,我可以在 Endpoint 类中再次加载资源,但这是重复工作。

我确信这一定是一个常见的场景,那么这里有公认的最佳实践方法吗?

4

0 回答 0