gpt4 book ai didi

javascript - websocket over spring4 和 spring security SockJS/info?t=

转载 作者:行者123 更新时间:2023-11-30 20:04:45 25 4
gpt4 key购买 nike

我正在尝试在 spring 上使用 websocket 来发送和接收一些字符串。我曾经在 google 上使用过一个示例,但是在将所有内容放在一起之后,我收到了一个 url 请求,该 url 在我的 contorller 请求中不可用。

flow/websocket/add/info?t=1540813753999

我的 Controller 看起来像这样:

 @Controller("webSocketController") @RequestMapping("/websocket")
public class WebSocketController {

@MessageMapping("/add" )
@SendTo("/topic/showResult")
public Result addNum(CalcInput input) throws Exception {
Thread.sleep(2000);
Result result = new Result(input.getNum1()+"+"+input.getNum2()+"="+(input.getNum1()+input.getNum2()));

return result;
}

@RequestMapping("/start")
public String start() {
return "start";
} }

@Configuration
@EnableWebSocketMessageBroker
public class AppWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/calcApp");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/add").setAllowedOrigins("*").withSockJS();
}

}

Javascript 部分:

<s:url value="/flow/websocket/add" var="sockendpoint" htmlEscape="true" />
<s:url value="/flow/websocket/topic/showResult" var="showresult" htmlEscape="true" />
<s:url value="/flow/websocket/calcApp/add" var="calcApp" htmlEscape="true" />


<script type="text/javascript">
var stompClient = null;

function setConnected(connected) {
document.getElementById('connect').disabled = connected;
document.getElementById('disconnect').disabled = !connected;
document.getElementById('calculationDiv').style.visibility = connected ? 'visible'
: 'hidden';
document.getElementById('calResponse').innerHTML = '';
}

function connect() {
var socket = new SockJS('${sockendpoint}');
//var socket = new WebSocket('${sockendpoint}');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('${showresult}', function(calResult) {
showResult(JSON.parse(calResult.body).result);
});
}, function(error) {
console.log(error);
});
}

function disconnect() {
stompClient.disconnect();
setConnected(false);
console.log("Disconnected");
}

function sendNum() {
var num1 = document.getElementById('num1').value;
var num2 = document.getElementById('num2').value;
stompClient.send("${calcApp}", {}, JSON.stringify({
'num1' : num1,
'num2' : num2
}));
}

function showResult(message) {
var response = document.getElementById('calResponse');
var p = document.createElement('p');
p.style.wordWrap = 'break-word';
p.appendChild(document.createTextNode(message));
response.appendChild(p);
}
</script>

/flow 是 spring 在 dispatcher 上的主要映射

提前致谢

最佳答案

“信息”端点由 SockJS 自动添加,因为它是其协议(protocol)的一部分。

这是完全正常的,端点由客户端用来检索有关服务器功能的信息。

此外,AFAIK 你无法避免它,因为它被指定为协议(protocol)的一部分,因此是强制性的。

请参阅Spring 文档。链接如下:

https://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/websocket.html

Section 22.3.1 Overview of SockJS,其中解释了端点背后的原因。


编辑:真正的问题与框架自动添加的“信息”端点无关。

问题是客户端在以下行中调用位于 servlet/app/stompEndpoint 的 STOMP 服务器端点: <s:url value="/flow/websocket/add" var="sockendpoint" htmlEscape="true" />

stomp 服务器端点/add 不是应用程序本身的一部分,因为服务器实际上可以包含多个应用程序。因此,正确的路径应该是 servlet/stompEndpoint。

<s:url value="/flow/add" var="sockendpoint" htmlEscape="true" />

此外,您可以查看以下 Hello World 示例,它以更详细的方式解释了这一点:https://spring.io/guides/gs/messaging-stomp-websocket/

关于javascript - websocket over spring4 和 spring security SockJS/info?t=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53045028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com