【问题标题】:Browser can't connect with spring4 websocket server浏览器无法连接spring4 websocket服务器
【发布时间】:2014-06-26 03:30:37
【问题描述】:

在 Tomcat 7.0.50 下运行的 Spring MVC 4.0.5 项目中,遵循the tutorial

当我启动 Tomcat 时,在 Eclipse 控制台(catalina 日志)中,出现行

Mapped URL path [/websocket.ws] onto handler of type [class org.springframework.web.socket.server.support.WebSocketHttpRequestHandler]

我从 Firefox Web 控制台收到错误“Firefox 无法连接到 ws://localhost/Books/websocket.ws”[HTTP/1.1 404 Not Found 6ms]。

我的配置:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
       xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <display-name>Archetype Created Web Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:websocket="http://www.springframework.org/schema/websocket"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/websocket
        http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd">


    <bean id="websocket" class="com.example.websocket.handler.WebsocketEndPoint" />

    <websocket:handlers>
        <websocket:mapping path="/websocket.ws" handler="websocket" />
        <websocket:handshake-interceptors>
            <bean class="com.example.websocket.HandshakeInterceptor" />
        </websocket:handshake-interceptors>
    </websocket:handlers>

</beans>

WebsocketEndPoint.java

package com.example.websocket.handler;

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class WebsocketEndPoint extends TextWebSocketHandler{

    @Override
    protected void handleTextMessage(WebSocketSession session,
            TextMessage message) throws Exception{
        super.handleTextMessage(session, message);
        System.out.println(message.getPayload());
        TextMessage returnMessage =new TextMessage(message.getPayload()+"received at server");
        session.sendMessage(returnMessage);
    }
}

HandshakeInterceptor.java

package com.example.websocket;

import java.util.Map;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{

    @Override
    public boolean beforeHandshake(ServerHttpRequest request,
            ServerHttpResponse response,WebSocketHandler wsHandler,
            Map<String,Object> attributes) throws Exception{
        System.out.println("Before Handshake!");
        return super.beforeHandshake(request,response,wsHandler,attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request,
            ServerHttpResponse response,WebSocketHandler wsHandler,
            Exception ex){
        System.out.println("After HandShake!");
        super.afterHandshake(request,response,wsHandler,ex);
    }
}

javascript代码:

Chat.socket = new WebSocket('ws://127.0.0.1:80/Books/websocket.ws');

web.xml 错了吗?

“Books”是我在 tomcat 中的项目名称。

感谢您的任何回答。

【问题讨论】:

标签: java spring web websocket


【解决方案1】:

我没有使用 Spring websocket。但我发现你的网址似乎是错误的。书从何而来? Firefox 想与“ws://localhost/Books/websocket.ws”连接。但在您的配置中,ws 端点绑定到“/websocket.ws”。

【讨论】:

  • sorry,"Books" 是我在 tomcat 中的项目名称。所以我的页面是 "localhost:80/Books"
【解决方案2】:

最近我遇到了同样的问题,我整天都在努力解决它。最后我意识到我需要通过 DispatcherServlet 而不是 ContextLoaderListener 来读取 websocket:handlers 标签。

   <servlet>
   <servlet-name>Spring4Sagussoft</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>WEB-INF/spring/webmvc-config.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
   <servlet-name>Spring4Sagussoft</servlet-name>
   <url-pattern>/</url-pattern>
   </servlet-mapping>

进入 webmvc-config.xml

   <websocket:handlers>
    <websocket:mapping path="/myHandler" handler="myHandler" />
   </websocket:handlers>
   <bean id="myHandler" class="com.laresistencia.pe.spring4.websocket.MyHandler" />

这对我有用。

【讨论】:

  • 嗯,我也遇到了类似的问题,你知道spring-websocket与struct2不兼容怎么解决吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 2014-07-20
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多