【发布时间】:2017-01-20 10:11:58
【问题描述】:
我实际上使用 Spring Famework 4.3.2 为 WebSocket over STOMP 实现了 Java SockJS 客户端。 我的 Javascript 客户端创建了一个 Java 客户端不创建的 nativeHeaders。
Java 客户端:
StandardWebSocketClient webSocketClient = new StandardWebSocketClient();
List<Transport> transports = new ArrayList<>(2);
transports.add(new WebSocketTransport(webSocketClient));
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new SimpleMessageConverter());
stompClient.setTaskScheduler(taskScheduler);
StompSessionHandlerImp stompSessionHandlerImp = new StompSessionHandlerImp();
WebSocketHttpHeaders handshakeHeaders = new WebSocketHttpHeaders();
handshakeHeaders.add("tokenGroup", "192:168:99:3::DEMO");
handshakeHeaders.add("targetNickname", "NULL_BORRAR");
stompClient.connect(stompUrlEndpoint.toString(), handshakeHeaders, stompSessionHandlerImp, new Object[0]);
JavaScript:
var from = "192:168:99:3::DEMO";
var targetNickname = "";
stompClient.connect({tokenGroup:from, targetNickname: targetNickname}, function(frame) {
...
}
在服务器端,使用 ChannelInterceptorAdapter 的实现来查看输出。 JavaScript 客户端在 nativeHeaders 中包含 tokenGroup 和 targetNickname。
Java客户端websocket升级握手:
request.getHeaders(): {Origin=[localhost:8080], Sec-WebSocket-Key=[tVFgflo2od6obTCKW/Y1Ng==],
Connection=[Upgrade], Sec-WebSocket-Version=[13], Host=[localhost:8080],
Upgrade=[websocket],
**targetNickname=[NULL_BORRAR], tokenGroup=[192:168:99:3::DEMO]**}
Java 客户端 websocket CONNECT Stomp 消息:
message: GenericMessage [payload=byte[0], headers={simpMessageType=CONNECT, stompCommand=CONNECT, **nativeHeaders={heart-beat=[10000,10000], accept-version=[1.1,1.2]}**, simpSessionAttributes={ip=/127.0.0.1:53640}, simpHeartbeat=[J@907d80, simpSessionId=2c150f9d47504b76a896ada101e8e1bc}]
JavaScript 客户端 websocket 升级握手:
request.getHeaders(): {Origin=[http://localhost:3000], Sec-WebSocket-Key=[slsZkCofKgaFZyxsADbzlw==],
User-Agent=[Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36],
Connection=[Upgrade], Sec-WebSocket-Version=[13], Host=[localhost:8080],
Accept-Encoding=[gzip, deflate, sdch], DNT=[1], Pragma=[no-cache],
Upgrade=[websocket], Sec-WebSocket-Extensions=[permessage-deflate; client_max_window_bits], Cache-Control=[no-cache], Accept-Language=[en-US,en;q=0.8]}
JavaScript 客户端 Websocket CONNECT Stomp 消息:
message: GenericMessage [payload=byte[0], headers={simpMessageType=CONNECT, stompCommand=CONNECT, **nativeHeaders={tokenGroup=[192:168:99:4::DEMO], targetNickname=[], accept-version=[1.1,1.0], heart-beat=[10000,10000]}**, simpSessionAttributes={ip=/127.0.0.1:55150}, simpHeartbeat=[J@915deb, simpSessionId=g3pcbfvj}]
可以看到Java客户端有nativeHeaders={heart-beat=[10000,10000],accept-version=[1.1,1.2]},Javacript有nativeHeaders={tokenGroup =[192:168:99:4::DEMO], targetNickname=[], accept-version=[1.1,1.0], heart-beat=[10000,10000]}
如何将“tokenGroup”包含在 Java 客户端中? Java 和 JavaScript 客户端工作方式不同正常吗?
【问题讨论】:
标签: stomp spring-websocket sockjs java-websocket