最新の安定バージョンについては、Spring Session 3.4.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 として作成されます。これにより、すべてのSession
ID が対応する WebSocket 接続に確実にマッピングされます。このマッピングを維持することにより、Spring Session(HttpSession)が終了したときに、すべての WebSocket 接続を閉じることができます。