我正在使用websockets将有关资源的信息从服务器传递到客户端。 websocket Endpoint使用pathparam来标识特定资源。例如:
@ServerEndpoint("/resources/{resource-id}/updates")
Endpoint类在其onOpen
方法中具有以下逻辑:
@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类中再次加载资源,但这是重复工作。
我确信这必须是一个常见的场景,所以这里有一种公认的最佳实践方法吗?