0
votes

I have implemented a Java SockJS client for WebSocket over STOMP using Spring Famework 4.3.2 actually. My Javascript client create a nativeHeaders that Java client dont create.

Java client:

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) {
...
}

In the server side, a use the an implementation of ChannelInterceptorAdapter to see the output. JavaScript client include tokenGroup and targetNickname into nativeHeaders.

Java client websocket upgrade handshake:

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 client websocket CONNECT Stomp Message:

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 client websocket upgrade handshake:

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 client Websocket CONNECT Stomp Message:

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}]

You can see that Java client have nativeHeaders={heart-beat=[10000,10000], accept-version=[1.1,1.2]} and Javacript have nativeHeaders={tokenGroup=[192:168:99:4::DEMO], targetNickname=[], accept-version=[1.1,1.0], heart-beat=[10000,10000]}

How can I include the "tokenGroup" into Java client? Is normal that Java and JavaScript client work different?

1

1 Answers

1
votes

Solution:

You need use the overloaded method that include an StompHeaders.

WebSocketHttpHeaders handshakeHeaders = new WebSocketHttpHeaders();
StompHeaders connectHeaders = new StompHeaders();
connectHeaders.add("tokenGroup", "192:168:99:3::DEMO");
stompClient.connect(stompUrlEndpoint.toString(), handshakeHeaders, connectHeaders, stompSessionHandlerImp, new Object[0]);

Now this produce the next in the server:

message: GenericMessage [payload=byte[0], headers={simpMessageType=CONNECT, stompCommand=CONNECT, nativeHeaders={tokenGroup=[192:168:99:3::DEMO], heart-beat=[10000,10000], accept-version=[1.1,1.2]}, simpSessionAttributes={ip=/127.0.0.1:57773}, simpHeartbeat=[J@1ac7a81, simpSessionId=a1648581b94d422e8b88258efad36ffb}]

nativeHeader now include the tokenGrouo header on connect.