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