WebSocket的坑

WebSocket

用ssm写了一个小的毕设,我想在其中加入服务端向客户端发送消息的功能,于是选了WebSocket来实现,写好后在本地调试没有问题,放到云服务器上就出问题了。。。项目部署到服务器上后,在websocket的握手阶段获取不到session了

一、javaee websocket和spring websocket

因为项目框架使用了ssm,所以采用了spring框架集成好的websocket,既然这样,按道理讲,我在登录上设置好了session,那么在重载HandshakeInterceptor类的beforeHandshake方法时就可以直接获取session值,方便接下来要实现的对点发送信息功能。重写的beforeHandshake方法如下图
WebSocket的坑
在是用javaee原生的websocket时好像不能直接取用session(没做具体了解)

二、IP访问和域名访问同一网站在浏览器中存储的sessionid不是同一个

这个标题就是我出错的地方
我在js代码中建立websocket长连接时发送的链接中使用了IP地址,代码如下

// 首先判断是否 支持 WebSocket
if('WebSocket' in window) {
    websocket = new WebSocket("ws://xxx.xxx.xxx.xxx:8080/dydadmin/websocket");
} else if('MozWebSocket' in window) {
    websocket = new MozWebSocket("ws://xxx.xxx.xxx.xxx:8080/dydadmin/websocket");
} else {
    websocket = new SockJS("http://xxx.xxx.xxx.xxx:8080/dydadmin/sockjs/websocket");
}

IP地址就不放出来了
访问时,我在浏览器中输入的时我的.com域名,出问题后我就很奇怪,先是报302,我想肯定是被登录验证拦住了,然后我把/websocket接口放开。放开之后又报200。然后我去
beforeHandshake方法中调试,发现可以进入beforeHandshake方法中,然后因为找不到session,return false了。
在以后就是一顿百度google,才了解到session的这一机制,IP访问和域名访问在浏览器中存储的是两个sessionid。
下面是浏览器中域名和IP各自存储的session
WebSocket的坑
WebSocket的坑

三、解决方法

类似二级域名,一级域名,ip访问都会建立不同的session
去百度可以找到如何解决session跨域类问题的方法,然后我遇到的场景中还有一个简单取巧的方法,就是前端界面使用js获取浏览器地址中的链接,判断是使用了那种访问方式,然后对应得去建立websocke连接。