Websockets と RabbitMQ をブローカーとして Spring MVC 4 を使用する小さなプロジェクトを作成しました。単一のユーザー (convertAndSendToUser) に送り返そうとしていますが、機能していないようです。アプリケーションの機能は次のとおりです。
- HTTP 経由で Spring Security に認証します。認証は AJAX を介して行われ、バックエンドはすべての新しい接続にユーザー名として UUID を割り当てます。同じユーザー名を持つ複数のクライアントが存在する可能性があるため、同じユーザー名でログインしている可能性がありますが、個々のブラウザーをターゲットにできるようにしたいと考えています。
AJAX で認証した後、webapp は Websocket で STOMP を使用して API に接続します。これらは、CONNECT FRAME で送り返されるヘッダーです。
body: "" command: "CONNECTED" headers: Object heart-beat: "0,0" server: "RabbitMQ/3.3.1" session: "session-OGzAN6T8Y0X9ft3Jq04fiQ" user-name: "88dc9424-72e3-4814-be8c- e31dbf89b521" バージョン: "1.1"
ご覧のとおり、frame-suffixまたは session-id フィールドはありません。
- バックエンドから convertAndSendToUser を使用すると、応答は /exchange/jobs-userh6g_48h9 のような一意のキューに送信されます。キュー名は /exchange/jobs ですが、Spring は自動的にサフィックス-userh6g_48h9を付加します。ユーザー名は "user" で、sessionId は "h6g_48h9" です。これで問題ありません。この動作が必要ですが、問題は、クライアント (webapp) が CONNECT フレームでこのセッション ID を取得せず、取得する方法がないことです。実際にその一意のキューにサブスクライブします。
これを解決するには?クライアントがこのサフィックスを取得して、独自のキューにサブスクライブできるように、接続時にキュー サフィックス/セッション ID が返されます。現在、この情報が不足しているため、サーバーからメッセージが返されません。