m.n*_*ntt 2 stomp websocket backbone.js spring-websocket
当我尝试在Spring websocket上从客户端向服务器发送消息时,我遇到了问题.我在服务器上配置Websocket并在控制器上创建@Message.我通过javascript从客户端发送数据.它有时会工作,但有时会失败并在服务器上抛出消息:MissingSessionUserException:消息中没有"user"标题
这是我的WebsocketConfig:
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/connectsocket").withSockJS();
}
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的MessageController:
@RestController
public class MessageController {
@Autowired
private SimpMessagingTemplate template;
@MessageMapping("/websocket/message")
public synchronized void message(Message<Object> messageObj,
WebMessage message, Principal principal) throws Exception {
if (principal != null) {
String name = principal.getName();
template.convertAndSendToUser(name, "/topic/dynamic", new MessagePojo("stage", "value", "message"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Javascript-backbonejs代码:
app.Models.WebsocketModel = Backbone.Model.extend({
fetchData : function() {
console.log("WebsocketModel: fetchData");
var socket = new SockJS(url + "/connectsocket");
var client = Stomp.over(socket);
var onConnect = function(frame) {
console.log('Connected: ' + frame);
client.subscribe("/user/topic/dynamic", function(data) {
var jsonBody = JSON.parse(data.body);
console.log(jsonBody);
});
};
client.connect({}, onConnect);
setInterval(function() {
client.send("/websocket/message", {}, JSON.stringify({
"message" : "Hello world!!!",
"toUser" : "Someone"
}));
}, 10000);
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的服务器错误日志:
[2016年4月14日 - 02:13:19]错误:[org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler] - 未处理的异常org.springframework.messaging.simp.annotation.support.MissingSessionUserException:消息中没有"user"标头at org.springframework.messaging org.springframework.messaging. org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch上的org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:108)中的.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:139) (AbstractMethodMessageHandler.java:490)org.springframework.messaging.simp.annotation.support.SimpAnnotationM ethdMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:497)org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:87)org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler. Java的:451)在org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:389)在org.springframework.messaging.support.ExecutorSubscribableChannel $ SendTask.run(ExecutorSubscribableChannel.java:135)在java.util中.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)
您正在尝试订阅用户目标,因此必须对用户进行身份验证.
如果这是一个想要订阅该主题的匿名用户,则回答此问题会有所帮助.
您必须为用户分配匿名身份,并且有两个选项:
配置DefaultHandshakeHandler该覆盖的子类,determineUser并为每个WebSocketSession分配某种标识.
WebSocket会话将HttpServletRequest.getUserPrincipal依赖于握手HTTP请求返回的值.你可以有一个servlet Filter包装HttpServletRequest并决定从该方法返回什么.或者,如果您正在使用具有AnonymousAuthenticationFilter的Spring Security,请覆盖其createAuthentication方法.
| 归档时间: |
|
| 查看次数: |
3776 次 |
| 最近记录: |