我使用Spring实现了一个服务器,现在我正在尝试使用stomp-stomp连接到我的服务器。我发现真正令人尴尬的是,JS实现无法工作,尽管我使用Java stomp客户端成功地使其工作。
Java代码(works):
WebSocketStompClient stompClient = new WebSocketStompClient(new SockJsClient(createTransportClient()));
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
final String URL = "http://localhost:" + port + "/ws";
// -< Headers used for authentication
WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
String user = "user1", pass = "abcd1234";
headers.add("Authorization", "Basic " + getBasicAuthToken(user, pass));
StompSession stompSession = stompClient.connect(URL, headers, new StompSessionHandlerAdapter() {
}).get(10, TimeUnit.SECONDS);JS客户端代码(不工作):
connect: function() {
const stompConfig = {
connectHeaders: {
login: "user1",
passcode: "abcd1234",
Authorization: "Basic dXNlcjE6YWJjZDEyMzQ="
},
webSocketFactory: function() {
return new SockJS("http://localhost:8080/ws");
},
reconnectDelay: 60000
};
rxStomp = new RxStomp.RxStomp();
rxStomp.configure(stompConfig);
rxStomp.activate();
rxStomp.connected$.subscribe(res => {
if (res === 1) console.log('connected');
else console.log('not connected');
});
}首先,我发现一个提示要求我输入用户名和密码,这让我感到很尴尬。如果我在那里输入凭据,那么客户端连接成功。因此,我认为对于连接头,我肯定做错了什么。正如您所看到的,我尝试在那里添加基本的Auth令牌,希望它能解决一些问题。事实并非如此。
发布于 2022-09-14 17:21:35
Java和Javascript版本的代码,尽管相似,但在一个重要的方面有所不同。Java在Websocket的基础HTTP连接中设置Authorization头。但是,在Javascript版本中,将进行HTTP连接,然后将Authorization头作为STOMP框架传递。
浏览器Websocket API或SockJS不允许为问题中的代码的Java使用的底层HTTP连接设置自定义头。为了支持身份验证,代理需要支持接收身份验证参数作为连接帧的一部分(在JS客户机中作为connectHeaders公开)。
缺省情况下,Spring不支持将身份验证参数作为连接帧的一部分。请参阅https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#websocket-stomp-authentication-token-based以支持它。
https://stackoverflow.com/questions/59075171
复制相似问题