【问题标题】:Websocket stopped working on tomcat 7.0.50Websocket 停止在 tomcat 7.0.50 上工作
【发布时间】:2014-04-02 10:46:17
【问题描述】:

我最近在 tomcat 7.0.50 上实现了 websocket。我的 tomcat 在 apache 2.4 后面运行。 我使用 Strtus 2 和 Spring Security。它已停止工作。

问题: Websocket 连接已成功打开。 Javascript 事件处理程序成功触发。 Apache 日志显示请求被接受为带有 101 代码的协议升级请求 Tomcat 访问日志也显示相同的代码 101 进行协议升级

但是在服务器端 onOpen 消息不会被触发。 我尝试在 javascript 的事件处理程序中打开连接后立即发送消息.. javascript 中没有错误,但服务器端 endPoint 的 onmessage 永远不会被调用,就像 onOpen 永远不会被调用一样。

以下是我在它停止工作后所做的更改:

 Windows Host file : I use dummy host name through Windows host file:
127.0.0.1    phasingapp.com
127.0.0.1    pricer.com

wesocket的网址:

old  :  ws://localhost:86/websocket/filuploadtrackerendpoint
new : ws://phasingapp.com:86/websocket/filuploadtrackerendpoint

为 apache 添加了虚拟主机配置:

 <Location /jkweb/websocket/>
    Require host phasingapp.com granted
</Location>    

JkMount /jkweb/* localtomcat
JkUnMount /jkweb/project/content/*  localtomcat
JkUnMount /jkweb/angle/content/*  localtomcat
JkUnMount /jkweb/index.jsp localtomcat
JkUnMount /jkweb/ localtomcat

ProxyRequests Off
ProxyPreserveHost On

ProxyPass /jkweb  !
ProxyPass /jkweb/  !
ProxyPass /jkweb/websocket/  ws://localhost:8080/jkweb/websocket/
ProxyPassReverse /jkweb/websocket/  ws://localhost:8080/jkweb/websocket/
ProxyPass /  http://localhost:8080/jkweb/
ProxyPassReverse /  http://localhost:8080/jkweb/

Struts 2:

 changed url pattern for Struts 2 filter from ".action to " /* ". Also added exclusion   filters
 to strtus2  for webscoket urls :

<constant name="struts.action.excludePattern" value=".*websocket/.*"/>

一切似乎都运行良好,因为我在 apache、tomcat、spring security 和 Struts2 日志中的任何地方都没有错误。

但是在服务器端没有调用处理程序?

早些时候我遇到过类似的问题,但这是因为我将 websocket-api jar 放在了我的 WEB-INF/lib 中,这阻止了 websocket 连接被打开。现在连接已打开,但此后没有调用任何处理程序,并且一段时间后连接显然是由于我想的超时而关闭的。

这是我的 ServerEndPoint 类:

      package com.jkweb.websocket;

        import java.io.IOException;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;

        import javax.websocket.EndpointConfig;
        import javax.websocket.OnMessage;
        import javax.websocket.OnOpen;
        import javax.websocket.Session;
        import javax.websocket.server.PathParam;
        import javax.websocket.server.ServerEndpoint;

        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;

        @ServerEndpoint(value="/websocket/fileuploadtracker")
       public class FileUploadTrackerEndPoint{
       private static final Logger logger = LoggerFactory
            .getLogger(FileUploadTrackerEndPoint.class);
       private static HashMap<String,Session> socketConnectionMap = new    HashMap<String,Session>();

    @OnOpen 
    public void open(Session session) {
        Map<String,List<String>> paramMap = session.getRequestParameterMap();
        List<String> uniqueTockenValues = paramMap.get("uniqueTocken");
        if(uniqueTockenValues != null && uniqueTockenValues.size() > 0){
            socketConnectionMap.put(uniqueTockenValues.get(0),session); 
        }
    }
    @OnMessage
    public void onMessage(Session session, String msg) {
        try {
            session.getBasicRemote().sendText(msg);
        } catch (IOException e) {
            logger.error(e.getMessage());
        }
    }

    public static void sendMessage(String uniqueTocken,String msg){
        try {
            Session wsSession = socketConnectionMap.get(uniqueTocken);
            wsSession.getBasicRemote().sendText(msg);
        } catch (IOException e) {
            logger.error(e.getMessage());
        }
    }
}

还有我的 javascript 代码:

createFileUploadWebSocket : function(){
            var that = this;
            var uniqueTocken = $("#uniqueTocken").val(),
            wsurl =  "ws://phasingapp.com:86/jkweb/websocket/fileuploadtracker?uniqueTocken="+uniqueTocken,
            ws;
            ws = new WebSocket(wsurl);
             ws.onopen = function()
             {
                 alert("opened..") //I get this aler sothis is called
                 ws.send("test");//however this has not effect ...no error but server end point is not called
             };
             ws.onmessage = function (evt) 
             { 
                 message = evt.data;
                 if(message == "Done."){
                     alert("closing..");
                     ws.close();
                     $('#progressbar').progressbar('option','value',100);
             }
                 var currentVal = $('#progressbar').progressbar('option','value');
                 $('#progressbar').progressbar('option','value',currentVal <= 80 ?currentVal+1 : currentVal);
             };
             ws.onclose = function(evt)
             { 
                // websocket is closed.
                alert("Connection is closed..."+evt.code + ":"+evt.reason ); 
             };

             ws.onerror = function(evt){
                 alert("Connection is closed..."+evt.code + ":"+evt.reason );
             };

        },

【问题讨论】:

  • 下面是与初始日志请求相关的日志段:127.0.0.1 - - [01/Mar/2014:14:20:12 +0530] "GET /jkweb/js/angle/addAngle. js?_=1393663610411 HTTP/1.1" 200 4278 127.0.0.1 - - [01/Mar/2014:14:20:41 +0530] "GET /jkweb/angle/validateDuplicateAngleName.action?angleName=angle7 HTTP/1.1" 200 - phasingapp.com - - [01/Mar/2014:14:21:15 +0530] "GET /jkweb/websocket/fileuploadtracker?uniqueTocken=9c9e740c-7171-4c33-bc92-e0a46cb2d2b5 HTTP/1.1" 101 - 其他请求为什么它是 127.0.0.1,对于 websocket 请求,它是 phasingapp.com?
  • 将日志段添加到问题中,以便更清楚地理解。

标签: websocket tomcat7 apache2.4


【解决方案1】:

对于我的所有其他 websocket 问题,我再次在我的配置(错误配置)本身中找到了答案。

 ProxyPass /jkweb  !
 ProxyPass /jkweb/  !
 ProxyPass /jkweb/websocket/  ws://localhost:8080/jkweb/websocket/
 ProxyPassReverse /jkweb/websocket/  ws://localhost:8080/jkweb/websocket/
 ProxyPass /  http://localhost:8080/jkweb/
 ProxyPassReverse /  http://localhost:8080/jkweb/

我改变了 proxypass 指令的顺序,如下所示:

 ProxyPass /jkweb/websocket/  ws://localhost:8080/jkweb/websocket/
 ProxyPassReverse /jkweb/websocket/  ws://localhost:8080/jkweb/websocket/
 ProxyPass /jkweb  !
 ProxyPass /jkweb/  !
 ProxyPass /  http://localhost:8080/jkweb/
 ProxyPassReverse /  http://localhost:8080/jkweb/

将它放在 websocket 的 proxypass 指令之前会导致每个以 jkweb/ 开头的请求都会导致它绕过代理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2014-01-02
    • 2023-01-12
    • 1970-01-01
    • 2012-06-04
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多