最近、従来の spring プロジェクトから Spring ブート 1.3.1 に移行しました。既存のクライアントは Tyrus 1.12 を websocket クライアントとして使用しています。
アップグレード後、クライアントが接続されなくなり、AuthenticationException がスローされることがわかりました。奇妙なことに、サーバーの再起動後、AuthenticationException をスローした直後に初めて接続できます。もう少し掘り下げてみると、Tyrus は最初に 401 を受け取り、その後資格情報を渡すことがわかりました。サーバー ログは、最初に ROLE_ANONYMOUS を割り当て、次に正しいロール ROLE_GUEST を割り当てて、同じ動作を示しています。
ネゴシエーションの後、サーバーは接続を閉じて切断するようです。
Tyrus で spring stomp Websocket クライアントを使用すると、同じ動作が観察されました。
ClientManager container = ClientManager.createClient();
container.getProperties().put("org.glassfish.tyrus.client.sharedContainer", true);
container.getProperties().put(ClientProperties.CREDENTIALS, new Credentials("guest", "guest"));
StandardWebSocketClient webSocketClient = new StandardWebSocketClient(container);
final CountDownLatch messageLatch = new CountDownLatch(10);
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
資格情報がヘッダーで送信される場合、この同じサーバー設定は正常に機能します。
stompClient.connect(url, getHandshakeHeaders("guest", "guest"), handler);
資格情報がヘッダーにないため、これは機能しません
ListenableFuture<StompSession>session = stompClient.connect(url, handler, "localhost", "8080");
なぜそれが一方の方法で機能し、もう一方の方法では機能しないのか理解できません。
spring-boot にアップグレードした後、私たちのソフトウェアは下位互換性がなくなり、401 を受け取る前にすべての外部クライアントにヘッダーに承認を挿入するように依頼する必要があります。
誰か助けてくれませんか?