Spring 4 WebSocket应用程序

我试图从spring网站运行这个例子: 教程除了Spring Boot部分。

在web.xml

 Archetype Created Web Application  sample org.springframework.web.servlet.DispatcherServlet  contextClass  org.springframework.web.context.support.AnnotationConfigWebApplicationContext    contextConfigLocation  com.evgeni.websock.WebSocketConfig     sample /   

Java配置:

 @Configuration @ComponentScan(basePackages = {"com.evgeni.controller"}) @EnableWebSocketMessageBroker @EnableWebMvc public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketMessageBrokerConfigurer { public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/hello").withSockJS(); } public void configureClientInboundChannel(ChannelRegistration registration) { // TODO Auto-generated method stub } public void configureClientOutboundChannel(ChannelRegistration registration) { // TODO Auto-generated method stub } public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926); registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926); registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926); } } 

控制器:

 @Controller public class GreetingController { @MessageMapping("/hello") @SendTo("/topic/greetings") public Greeting greeting(HelloMessage message) throws Exception { Thread.sleep(3000); // simulated delay System.out.println(message.getName()); return new Greeting("Hello, " + message.getName() + "!"); } } 

的index.jsp

     Hello WebSocket <script src=""> <script src="">  var stompClient = null; function setConnected(connected) { document.getElementById('connect').disabled = connected; document.getElementById('disconnect').disabled = !connected; document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden'; document.getElementById('response').innerHTML = ''; } function connect() { var socket = new SockJS(""); stompClient = Stomp.over(socket); stompClient.connect('', '', function(frame) { setConnected(true); console.log('Connected: ' + frame); stompClient.subscribe("", function(greeting){ showGreeting(JSON.parse(greeting.body).content); }); }); } function disconnect() { stompClient.disconnect(); setConnected(false); console.log("Disconnected"); } function sendName() { var name = document.getElementById('name').value; stompClient.send("", {}, JSON.stringify({ 'name': name })); } function showGreeting(message) { var response = document.getElementById('response'); var p = document.createElement('p'); p.style.wordWrap = 'break-word'; p.appendChild(document.createTextNode(message)); response.appendChild(p); }    

Seems your browser doesn't support Javascript! Websocket relies on Javascript being enabled. Please enable Javascript and reload this page!

Everithing与教程相同,除了从web.xml加载conf和在jsp中加载2-3 c:url以添加项目的根。

当我点击连接然后发送时,在浏览器控制台中我得到:

 Opening Web Socket... stomp.js:122 Web Socket Opened... stomp.js:122 >>> CONNECT login: passcode: accept-version:1.1,1.0 heart-beat:10000,10000 stomp.js:122 <<< ERROR message:Illegal header\c 'login\c'. A header must be of the form \c content-length:0 stomp.js:122 >>> SEND destination:/websock/app/hello content-length:14 {"name":"asd"} 

我认为问题在于Sock js的连接function

 stompClient.connect('', '', function(frame) {... 

我正在传递”用于登录和密码。

编辑:当我将connect函数更改为stompClient.connect('random', 'random',控制台中的响应为:

 Opening Web Socket... stomp.js:122 Web Socket Opened... stomp.js:122 >>> CONNECT login:asd passcode:asd accept-version:1.1,1.0 heart-beat:10000,10000 stomp.js:122 <<>> SUBSCRIBE id:sub-0 destination:/websock/topic/greetings stomp.js:122 >>> SEND destination:/websock/app/hello content-length:14 {"name":"asd"} 

但是消息未传递给控制器​​。

错误是错误的控制器映射。 我有:

  @MessageMapping("/hello") @SendTo("/topic/greetings") public Greeting greeting(HelloMessage message) throws Exception 

在jsp中:

 stompClient.subscribe("", function(greeting){... 

 stompClient.send("", {}, JSON.stringify({ 'name': name })); 

正确的是:

 stompClient.subscribe('/topic/greetings', function(greeting){... stompClient.send('/app/hello', {}, JSON.stringify({ 'name': name })); 

c:url添加项目的根,当我删除它时,应用程序工作。 但是在这里使用SockJs创建新套接字时需要c:url(root):

 var socket = new SockJS(""); 

此外,如果您不想将登录名/密码传递给服务器(因为您可能依赖于Spring安全性),那么您不应该使用

 stompClient.connect('', '', function(frame) { 

但反而

 stompClient.connect({}, function(frame) { 

看看这里: https : //github.com/spring-guides/gs-messaging-stomp-websocket/issues/10