Websocket在tomcat 7.0.50上停止工作

Websocket在tomcat 7.0.50上停止工作,websocket,tomcat7,apache2.4,Websocket,Tomcat7,Apache2.4,我最近在Tomcat7.0.50上实现了websocket。我的tomcat运行在apache 2.4之后。 我使用Strtus 2和Spring Security。它已经停止工作了 问题: 已成功打开Websocket连接。 Javascript事件处理程序成功获取火灾。 Apache日志显示,该请求被接受为协议升级请求,代码为101 Tomcat访问日志也显示相同的协议升级代码101 但是,在服务器端,不会触发onOpen消息。 我尝试在javascript的事件处理程序中打开连接后立即发送

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

问题: 已成功打开Websocket连接。 Javascript事件处理程序成功获取火灾。 Apache日志显示,该请求被接受为协议升级请求,代码为101 Tomcat访问日志也显示相同的协议升级代码101

但是,在服务器端,不会触发onOpen消息。 我尝试在javascript的事件处理程序中打开连接后立即发送消息。。 javascript中没有错误,但从未调用服务器端端点的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的URL:

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/

要求授予host phasingapp.com
JkMount/jkweb/*localtomcat
jkumount/jkweb/project/content/*localtomcat
jkumount/jkweb/angle/content/*localtomcat
JkUnMount/jkweb/index.jsp localtomcat
jkunlunmount/jkweb/localtomcat
代理请求关闭
代理主机
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/.*"/>
将Struts 2过滤器的url模式从“.action”更改为“/*”。还添加了排除过滤器
要为WebCoket URL创建struts2,请执行以下操作:
在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());
        }
    }
}
package com.jkweb.websocket;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入javax.websocket.EndpointConfig;
导入javax.websocket.OnMessage;
导入javax.websocket.OnOpen;
导入javax.websocket.Session;
导入javax.websocket.server.PathParam;
导入javax.websocket.server.ServerEndpoint;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
@ServerEndpoint(value=“/websocket/fileuploadtracker”)
公共类FileUploadTrackerEndPoint{
专用静态最终记录器记录器=记录器工厂
.getLogger(FileUploadTrackerEndPoint.class);
私有静态HashMap socketConnectionMap=新HashMap();
@奥诺彭
公开作废开放(会议){
Map paramMap=session.getRequestParameterMap();
List uniqueTockenValues=paramMap.get(“uniqueTocken”);
if(uniqueTockenValues!=null&&uniqueTockenValues.size()>0){
socketConnectionMap.put(uniqueTockenValues.get(0),会话);
}
}
@OnMessage
公共void onMessage(会话,字符串msg){
试一试{
session.getBasicRemote().sendText(msg);
}捕获(IOE异常){
logger.error(例如getMessage());
}
}
公共静态void sendMessage(字符串uniqueTocken,字符串msg){
试一试{
会话wsSession=socketConnectionMap.get(uniqueTocken);
wsSession.getBasicRemote().sendText(msg);
}捕获(IOE异常){
logger.error(例如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 );
             };

        },
createFileUploadWebSocket:function(){
var=这个;
var uniqueTocken=$(“#uniqueTocken”).val(),
wsurl=“ws://phasingapp.com:86/jkweb/websocket/fileuploadtracker?uniqueTocken=“+uniqueTocken,
ws;
ws=新的WebSocket(wsurl);
ws.onopen=函数()
{
警报(“打开的”)//我得到了这个aler,所以这个叫做
ws.send(“test”);//但是这不起作用……没有错误,但未调用服务器端点
};
ws.onmessage=函数(evt)
{ 
消息=evt.data;
如果(消息==“完成”){
警报(“关闭”);
ws.close();
$('progressbar')。progressbar('option','value',100);
}
var currentVal=$('progressbar').progressbar('option','value');

$(“#progressbar”).progressbar('option','value',currentVal与我的所有其他websocket问题一样,我在配置(错误配置)本身中找到了答案

我更改了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/开头的请求绕过代理。

下面是与初始日志请求相关的日志段:127.0.0.1---[01/Mar/2014:14:20:12+0530]“GET/jkweb/js/angle/addAngle.js?\u=1393663610411 HTTP/1.1”200 4278 127.0.1---[01/Mar/2014:14:20:41+0530]“GET/jkweb/angle/validateDuplicateAngleName.action?angleName=Angle7HTTP/1.1”200-phasingapp.com--[01/Mar/2014:14:21:15+0530]“GET/jkweb/websocket/fileuploadtracker?uniqueTocken=9c9e740c-7171-4c33-bc92-E0A46CB2D5HTTP/1.1“101-其他请求为什么为127.0.0.1,而websocket请求为phasingapp.com?请在问题中添加日志段,以便更清楚地理解。
 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/