サーバーからクライアントにリソースに関する情報を渡すために websockets を使用しています。websocket エンドポイントは、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 応答を送信します。クライアントは、再試行しないことを認識します。WebSocket に使用する同等の手法はありますか? 私の考えは次の2つです。
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 を返します。これは私にとって最良のアプローチのように思えますが、メソッドから標準の HTTP エラー応答を送信する方法はないようmodifyHandshake
です。このロジックは Filter で実行します。ただし、ここでの問題は、フィルターにリソースをロードした場合、それをエンドポイントに渡すにはどうすればよいかということです。HTTP リクエストを使用すると、フィルターにリクエスト属性を追加して、サーブレットで使用できるようになります。しかし、websocket で同じことを実現する簡単な方法はないようです。もちろん、Endpoint クラスでリソースを再度読み込むこともできますが、それは作業の重複です。
これは一般的なシナリオに違いないと確信しているので、ここで受け入れられているベストプラクティスのアプローチはありますか?