【发布时间】:2019-05-24 09:44:58
【问题描述】:
我有以下 JS 函数,它们通过 STOMP 连接到 WebSocket,并分别处理 onConnected 事件。
function connect(event) {
username = document.querySelector('#name').value.trim();
if(username) {
usernamePage.classList.add('hidden');
chatPage.classList.remove('hidden');
var socket = new SockJS('/ws');
stompClient = Stomp.over(socket);
stompClient.connect({}, onConnected, onError);
}
event.preventDefault();
}
function onConnected(response) {
console.log(response);
// Subscribe to the Public Topic
stompClient.subscribe('/topic/public', onMessageReceived);
// Tell your username to the server
stompClient.send("/app/chat.addUser",
{},
JSON.stringify({sender: username, type: 'JOIN'})
)
connectingElement.classList.add('hidden');
}
现在函数 onConnected 的第一行,它将以下内容记录到控制台中,这显然看起来像是我可以从服务器端添加更多数据的东西。
{
command: "CONNECTED",
headers: {
"heart-beat": "0,0",
version: "1.1"
},
body: ""
}
我还有一个HttpHandshakeInterceptor,它实现了HandshakeInterceptor,如下所示。
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map attributes) throws Exception {
if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
HttpSession session = servletRequest.getServletRequest().getSession();
attributes.put("sessionId", session.getId());
ServletServerHttpResponse servletResponse = (ServletServerHttpResponse) response;
response.getHeaders().set("KEY","VALUE"); // *** I want this either to be in the response header or the body.
}
return true;
}
注释以*** 开头的行是我现在正在做的事情,但没有成功。我究竟做错了什么?我什至可以这样做并向客户端获取一些参数吗?如果我做错了,如何以及在哪里做对? (因为现在我开始觉得我在错误的地方尝试这样做)
【问题讨论】:
-
您可以尝试使用属性而不是响应。或者返回 super
-
@kidnan1991 非常感谢您的建议。我应该从哪里开始?
-
在你的 beforeHandshake 函数中,如果它不能帮助,请原谅我:)
-
好的,我去看看...非常感谢您来看看...
-
关于放入header,可以查看stackoverflow.com/questions/42166472/…
标签: java spring-boot websocket stomp