WebSocket 整合

Spring Session 提供了與 Spring WebSocket 支援的透明整合。

Spring Session 的 WebSocket 支援僅適用於 Spring 的 WebSocket 支援。具體來說,它不直接與使用 JSR-356 配合使用,因為 JSR-356 沒有攔截傳入 WebSocket 訊息的機制。

為什麼選擇 Spring Session 和 WebSockets?

那麼,當我們使用 WebSockets 時,為什麼需要 Spring Session?

考慮一個電子郵件應用程式,它的大部分工作透過 HTTP 請求完成。但是,其中還嵌入了一個透過 WebSocket API 工作的聊天應用程式。如果使用者正在與某人積極聊天,我們不應該讓 HttpSession 超時,因為這會帶來非常糟糕的使用者體驗。然而,這正是 JSR-356 所做的。

另一個問題是,根據 JSR-356,如果 HttpSession 超時,則所有使用該 HttpSession 和已認證使用者建立的 WebSocket 都應被強制關閉。這意味著,如果我們在應用程式中積極聊天並且沒有使用 HttpSession,我們也會從對話中斷開連線。

WebSocket 用法

WebSocket 示例 提供了一個工作示例,說明如何將 Spring Session 與 WebSockets 整合。您可以按照接下來幾個標題中描述的基本整合步驟進行操作,但我們鼓勵您在將 Spring Session 與您自己的應用程式整合時,按照詳細的 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 支援,我們只需更改兩件事:

1 我們不實現 WebSocketMessageBrokerConfigurer,而是擴充套件 AbstractSessionWebSocketMessageBrokerConfigurer
2 我們將 registerStompEndpoints 方法重新命名為 configureStompEndpoints

AbstractSessionWebSocketMessageBrokerConfigurer 在幕後做了什麼?

  • WebSocketConnectHandlerDecoratorFactory 作為 WebSocketHandlerDecoratorFactory 新增到 WebSocketTransportRegistration 中。這確保會觸發一個包含 WebSocketSession 的自定義 SessionConnectEventWebSocketSession 對於在 Spring Session 結束時關閉所有仍然開啟的 WebSocket 連線是必需的。

  • SessionRepositoryMessageInterceptor 作為 HandshakeInterceptor 新增到每個 StompWebSocketEndpointRegistration 中。這確保將 Session 新增到 WebSocket 屬性中,以便能夠更新最後訪問時間。

  • SessionRepositoryMessageInterceptor 作為 ChannelInterceptor 新增到我們的入站 ChannelRegistration 中。這確保了每次收到入站訊息時,Spring Session 的最後訪問時間都會更新。

  • WebSocketRegistryListener 作為 Spring Bean 建立。這確保我們擁有所有 Session ID 到相應 WebSocket 連線的對映。透過維護此對映,我們可以在 Spring Session (HttpSession) 結束時關閉所有 WebSocket 連線。

© . This site is unofficial and not affiliated with VMware.