Lui*_* E. 6 java stomp sockjs spring-boot
我有客户端在 websocket 上像这样连接
var socket = new SockJS(this.props.stomp);
var stompClient = Stomp.over(socket);
var channel = "/room."+this.props.room.uid
var app = this;
stompClient.connect({room: this.props.room.uid}, function(frame) {
....
Run Code Online (Sandbox Code Playgroud)
在我的 Java 后端,我试图按照教程获取此标头:
public void onApplicationEvent(SessionConnectEvent event) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
String room = sha.getNativeHeader("room").get(0);
logger.debug("Connect event [sessionId: " + sha.getSessionId() +"; room: "+ room + " ]");
}
Run Code Online (Sandbox Code Playgroud)
但此时room为空。
我调试并发现了一个非常复杂的层次结构:aMessageHeaderAccessor包含一个映射,该映射包含一个 LinkedList,该映射具有一个nativeHeaders包含这些本机标头的键。
我的问题:有没有一种简单的方法来访问这个本机标头?到目前为止,我只得到像
MessageHeaderAccessor accessor = NativeMessageHeaderAccessor.getAccessor(event.getMessage(), SimpMessageHeaderAccessor.class);
accessor.getMessageHeaders();
Object header = accessor.getHeader("simpConnectMessage");
GenericMessage<?> generic = (GenericMessage<?>) accessor.getHeader("simpConnectMessage");
System.out.println(generic.getHeaders().get("nativeHeaders"));
Run Code Online (Sandbox Code Playgroud)
我真的觉得很难理解和使用。实际上,我唯一想要的就是跟踪当前连接到频道的用户数量,我认为实现 aApplicationListener是一种方法。我在这里可能是错的,所以如果有人发现了什么或实现了类似的东西,我想知道
我是这样做的:
JavaScript 片段
function connect() {
var socket = new SockJS('http://localhost:8081/ws/notification');
stompClient = Stomp.over(socket);
var header = {
"user-id" : "bb2c9039-0ed3-4d6f-b078-db965286944d"
}
stompClient.connect(header, function (frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/user/ws/notification/message', function (greeting) {
showGreeting(JSON.parse(greeting.body).name);
});
});
}
Run Code Online (Sandbox Code Playgroud)
Java片段
@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = accessor.getMessageHeaders().get(SimpMessageHeaderAccessor.SESSION_ID_HEADER, String.class);
String userId = getUserId(accessor);
log.info("User( user-id: {} ) established new WebSocket session( session-id: {} ).", userId, sessionId);
putSessionIdToMap(sessionId, userId);
}
private String getUserId(StompHeaderAccessor accessor) {
GenericMessage<?> generic = (GenericMessage<?>) accessor.getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER);
if (nonNull(generic)) {
SimpMessageHeaderAccessor nativeAccessor = SimpMessageHeaderAccessor.wrap(generic);
List<String> userIdValue = nativeAccessor.getNativeHeader("user-id");
return isNull(userIdValue) ? null : userIdValue.stream().findFirst().orElse(null);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1210 次 |
| 最近记录: |