WebSocket 統合

Spring Session は、Spring の WebSocket サポートとの透過的な統合を提供します。

Spring Session の WebSocket サポートは、Spring の WebSocket サポートでのみ機能します。具体的には、JSR-356 には受信 WebSocket メッセージをインターセプトするメカニズムがないため、JSR-356 (英語) を直接使用しても機能しません。

なぜ Spring Session と WebSockets なのでしょうか?

では、WebSockets を使用するときになぜ Spring Session が必要なのですか?

HTTP リクエストを介して多くの作業を行うメールアプリケーションについて考えてみます。ただし、WebSocket API 上で機能するチャットアプリケーションも組み込まれています。ユーザーが誰かと積極的にチャットしている場合は、HttpSession をタイムアウトしないでください。これは、ユーザーエクスペリエンスがかなり低下するためです。ただし、これはまさに JSR-356 (英語) が行うことです。

もう 1 つの課題は、JSR-356 によると、HttpSession がタイムアウトした場合、その HttpSession と認証されたユーザーで作成された WebSocket を強制的に閉じる必要があることです。つまり、アプリケーションでアクティブにチャットしていて、HttpSession を使用していない場合は、会話からも切断されます。

WebSocket の使用箇所

WebSocket サンプルは、Spring Session を WebSockets と統合する方法の実用的なサンプルを提供します。次のいくつかの見出しで説明する統合の基本的な手順に従うことができますが、独自のアプリケーションと統合する場合は、詳細な WebSocket ガイドに従うことをお勧めします。

HttpSession 統合

WebSocket 統合を使用する前に、最初に HttpSession 統合が機能していることを確認する必要があります。

Spring の設定

典型的な Spring WebSocket アプリケーションでは、WebSocketMessageBrokerConfigurer を実装します。例: 構成は次のようになります。

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.addEndpoint("/messages").withSockJS();
	}

	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		registry.enableSimpleBroker("/queue/", "/topic/");
		registry.setApplicationDestinationPrefixes("/app");
	}

}

Spring Session の WebSocket サポートを使用するように構成を更新できます。次の例は、その方法を示しています。

src/main/java/samples/config/WebSocketConfig.java
@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<Session> { (1)

	@Override
	protected void configureStompEndpoints(StompEndpointRegistry registry) { (2)
		registry.addEndpoint("/messages").withSockJS();
	}

	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		registry.enableSimpleBroker("/queue/", "/topic/");
		registry.setApplicationDestinationPrefixes("/app");
	}

}

Spring Session サポートをフックするには、次の 2 つを変更するだけです。

1WebSocketMessageBrokerConfigurer を実装する代わりに、AbstractSessionWebSocketMessageBrokerConfigurer を継承します
2registerStompEndpoints メソッドの名前を configureStompEndpoints に変更します

AbstractSessionWebSocketMessageBrokerConfigurer はバックグラウンドで何をしますか?

  • WebSocketConnectHandlerDecoratorFactory は WebSocketHandlerDecoratorFactory として WebSocketTransportRegistration に追加されます。これにより、WebSocketSession を含むカスタム SessionConnectEvent が確実に起動されます。WebSocketSession は、Spring Session が終了したときにまだ開いている WebSocket 接続を終了するために必要です。

  • SessionRepositoryMessageInterceptor は、すべての StompWebSocketEndpointRegistration に HandshakeInterceptor として追加されます。これにより、Session が WebSocket プロパティに追加され、最終アクセス時刻を更新できるようになります。

  • SessionRepositoryMessageInterceptor は、ChannelInterceptor として受信 ChannelRegistration に追加されます。これにより、受信メッセージを受信するたびに、Spring Session の最終アクセス時刻が更新されます。

  • WebSocketRegistryListener は Spring Bean として作成されます。これにより、すべての Session ID が対応する WebSocket 接続に確実にマッピングされます。このマッピングを維持することにより、Spring Session(HttpSession)が終了したときに、すべての WebSocket 接続を閉じることができます。