While extending org.springframework.web.socket.server.support
.DefaultHandshakeHandler
, there is a possibility to access determineUser
method, offering attributes
like so:
package com.example.websocketchat.stomp_principal;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.DefaultHandshakeHandler;
import java.security.Principal;
import java.util.Map;
import java.util.UUID;
public class CustomHandshakeHandler extends DefaultHandshakeHandler {
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
String uuid = UUID.randomUUID().toString();
StompPrincipal stompPrincipal = new StompPrincipal(uuid);
stompPrincipal.setUserName("??");
return stompPrincipal;
}
}
How do I pass those in stompClient using import { Client, over } from 'stompjs'
?
Below is my connect
method using stompClient.connect
connect: async (jwtToken: string) => {
const csrfToken = await fetch('http://localhost:8080/csrf-token', {
headers: {
Authorization: `Bearer ${jwtToken}`,
},
})
.then(response => response.json())
.then(data => data.token);
const socket = new WebSocket('ws://localhost:8080/websocket');
const stompClient = over(socket);
stompClient.connect(
{
Authorization: `Bearer ${jwtToken}`,
'X-XSRF-TOKEN': csrfToken,
},
frame => {
console.log('connected');
if (frame) {
set({
stompClient,
stompUserName: (frame.headers as { 'user-name': string })['user-name'],
});
}
},
err => console.log(err)
);
},
I have been told, that I should add them at ws URL like rdinary params like so:
const socket = new WebSocket('ws://localhost:8080/websocket?userName=user123')
However it doesn't work, how should I do this?
I'm using:
stompjs@2.3.3
springboot 3.0.6