![](/img/trans.png)
[英]how to capture subscribe event in my webSocket server with Spring 4
[英]how to capture connection event in my webSocket server with Spring 4?
我用 spring 4,STOMP 和 sock.js 做了一個簡單的 web 套接字通信,遵循這個https://github.com/rstoyanchev/spring-websocket-portfolio和這個http://assets.spring.io/ html
好吧,我想知道是否有可能捕獲連接事件,例如當新客戶端連接到我的服務器時或當客戶端斷開連接時,這在 Spring 4.0.0 中是否可能?
Spring WebSocket在從客戶端收到消息時發布事件,如果您使用的是STOMP,則這些是發布的事件:
檢測連接和斷開連接的最簡單方法是為上述事件實現事件監聽器。
public class WebSocketEventListener {
@EventListener
private void handleSessionConnected(SessionConnectEvent event) {
...
}
@EventListener
private void handleSessionDisconnect(SessionDisconnectEvent event) {
...
}
}
這是一個跟蹤連接用戶的示例實現: https : //github.com/salmar/spring-websocket-chat/blob/master/src/main/java/com/sergialmar/wschat/event/PresenceEventListener.java
這是一個連接握手攔截器( HttpSessionHandshakeInterceptor ),引用文檔 :
自定義初始HTTP WebSocket握手請求的最簡單方法是通過HandshakeInterceptor,它暴露握手方法的“之前”和“之后”。
據我了解,DISCONNECT事件的問題在本主題中沒有解決。 握手攔截只為您提供連接信息,但不會斷開連接。
我用入站通道的攔截器實現了這個目的:
<websocket:message-broker>
...
<websocket:client-inbound-channel>
<websocket:interceptors>
<bean class="com......MyChannelInterception"></bean>
</websocket:interceptors>
</websocket:client-inbound-channel>
</websocket:message-broker>
......和班級......
import java.security.Principal;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.simp.SimpMessageType;
import org.springframework.messaging.support.ChannelInterceptorAdapter;
public class MyChannelInterception extends ChannelInterceptorAdapter {
private static final Logger LOGGER = LogManager.getLogger(WrcChannelInterception.class);
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
MessageHeaders headers = message.getHeaders();
SimpMessageType type = (SimpMessageType) headers.get("simpMessageType");
String simpSessionId = (String) headers.get("simpSessionId");
if (type == SimpMessageType.CONNECT) {
Principal principal = (Principal) headers.get("simpUser");
LOGGER.debug("WsSession " + simpSessionId + " is connected for user " + principal.getName());
} else if (type == SimpMessageType.DISCONNECT) {
LOGGER.debug("WsSession " + simpSessionId + " is disconnected");
}
return message;
}
}
請注意,Principal可以在CONNECT上使用,但不能在DISCONNECT上使用,但是你有甜蜜的會話ID
雖然最初的問題是關於 Spring 4 - Sergi 很好地回答了這個問題。 這是在 Spring 5 或 Spring Boot 2 中執行此操作的方法(在引擎蓋下使用 Spring 5)。 需要實現ApplicationListener:
@Component
public class WebSocketEventListener implements ApplicationListener<SessionConnectEvent> {
Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);
@Override
public void onApplicationEvent(SessionConnectEvent event) {
logger.error("SessionConnectEvent = " + event);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.