最新の安定バージョンについては、Spring Session 3.5.3 を使用してください! |
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 サポートを使用するように構成を更新できます。次の例は、その方法を示しています。
@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 つを変更するだけです。
| 1 | WebSocketMessageBrokerConfigurer を実装する代わりに、AbstractSessionWebSocketMessageBrokerConfigurer を継承します |
| 2 | registerStompEndpoints メソッドの名前を configureStompEndpoints に変更します |
AbstractSessionWebSocketMessageBrokerConfigurer はバックグラウンドで何をしますか?
WebSocketConnectHandlerDecoratorFactoryはWebSocketHandlerDecoratorFactoryとしてWebSocketTransportRegistrationに追加されます。これにより、WebSocketSessionを含むカスタムSessionConnectEventが確実に起動されます。WebSocketSessionは、Spring Session が終了したときにまだ開いている WebSocket 接続を終了するために必要です。SessionRepositoryMessageInterceptorは、すべてのStompWebSocketEndpointRegistrationにHandshakeInterceptorとして追加されます。これにより、Sessionが WebSocket プロパティに追加され、最終アクセス時刻を更新できるようになります。SessionRepositoryMessageInterceptorは、ChannelInterceptorとして受信ChannelRegistrationに追加されます。これにより、受信メッセージを受信するたびに、Spring Session の最終アクセス時刻が更新されます。WebSocketRegistryListenerは Spring Bean として作成されます。これにより、すべてのSessionID が対応する WebSocket 接続に確実にマッピングされます。このマッピングを維持することにより、Spring Session(HttpSession)が終了したときに、すべての WebSocket 接続を閉じることができます。