我正在使用 websockets 将有关资源的信息从服务器传递到客户端。websocket Endpoint 使用路径参数来标识特定资源。例如:
@ServerEndpoint("/resources/{resource-id}/updates")
onOpen
Endpoint 类在其方法中具有以下逻辑:
@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 的等效技术?我的两个想法是:
if (!resourceExists)
在上面的块中使用以下代码:session.close(new CloseReason(CUSTOM_NOT_FOUND_CODE, "Resource ID not found")); return;
CUSTOM_NOT_FOUND_CODE
4000-4999 范围内的 CloseCode 在哪里。在此端点的实现中的某处执行此逻辑,
ServerEndpointConfig.Configurator
并在连接升级发生之前返回 404。这听起来对我来说是最好的方法,但似乎没有任何方法可以从该modifyHandshake
方法发送标准的 HTTP 错误响应。在过滤器中执行此逻辑。但是,这里的问题是,如果我在过滤器中加载资源,我如何将它传递给端点?使用 HTTP 请求,我可以在过滤器中添加请求属性,然后在 servlet 中可用。但是似乎没有一种简单的方法可以使用 websockets 实现相同的目标。当然,我可以在 Endpoint 类中再次加载资源,但这是重复工作。
我确信这一定是一个常见的场景,那么这里有公认的最佳实践方法吗?