我想在stomp标头中设置用户名,并在握手期间在Principal对象中设置该用户名。创建了我自己的HandshakeHandler,但是我无法在我从DefaultHandshakeHandler重写的方法determineUser中获取该用户名。
非常感谢任何帮助。这是相关代码 - >
这是我的客户代码 - >
var from = document.getElementById('username').value;
var socket = new SockJS('/WebSocketsChat/chat');
stompClient = Stomp.over(socket);
stompClient.connect({userName:from,sampleMsg:"Hello"},
function(frame) {
// Some more code here
这是我的HandShakeHandler - >
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat").setHandshakeHandler(new RandomUserNameHandshakeHandler()).withSockJS();
}
private class RandomUserNameHandshakeHandler extends DefaultHandshakeHandler{
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String,Object> attributes){
// Some Code that would give me the username set in Stomp Header
// For now i am randomly generating a username and setting in principal.
String username = "user"+"-"+ new Random().nextInt(100);
return new UsernamePasswordAuthenticationToken(username,null);
}
}
答案 0 :(得分:0)
FWIW,STOMP正在开发WebSocket。当客户端和服务器正在进行WebSocket握手时,STOMP还没有工作。所以显然你没有获得stomp.connect传递的用户名。
我不确定您如何在应用中验证用户身份。但是,如果你有一个身份验证机制,你不必传递用户名,通常已经有一个经过身份验证的用户可以通过HttpServletRequest#getUserPrincipal()访问, 可以在HandShakeHandler中访问。您可以参考spring docs了解更多详情。
但是,如果要通过连接标头发送用户名,您可以在ChannelInterceptor中获取,如this answer中所述。