您的位置:首页 > 其它

跳转至websocket聊天页面时传递简单信息

2017-10-25 11:52 190 查看
一、要求:

制作了两个简单的页面,一个是用户登录,一个是群聊的聊天室。

首先用户在登录页面输入账号密码登录后自动跳转至聊天室,在聊天室中,我希望能将用户信息带过去。

二、遇到的问题:

首先我想到的是使用session,因为WebSocket中的session不是http的session,而我在登录的代码中还是使用了request和response,所以在这中间需要使WebSocket获得httpsession。

查阅网上资料后,基本都说:继承Configurator类,重写modifyHandshake(ServerEndpointConfig sec,HandshakeRequest request, HandshakeResponse response)方法,然后在里面获取httpSession,代码如下:

import javax.servlet.http.HttpSession;

import javax.websocket.HandshakeResponse;

import javax.websocket.server.HandshakeRequest;

import javax.websocket.server.ServerEndpointConfig;

import javax.websocket.server.ServerEndpointConfig.Configurator;

public class GetHttpSessionConfiguration extends Configurator {  //该方法得到的session都是null,无法得到结果,如果添加监听,每次得到的session都不同,又不符合需求
@Override
public void modifyHandshake(ServerEndpointConfig sec,
HandshakeRequest request, HandshakeResponse response) {
// TODO Auto-generated method stub
//super.modifyHandshake(sec, request, response);
HttpSession httpSession = (HttpSession) request.getHttpSession();
sec.getUserProperties().put(HttpSession.class.getName(), httpSession);
}

最后在WebSocket的onOpen方法中使用httpsession:

HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());,

下面就可以用 httpSession.getAttribute("XX")去获取session了。

但是实际使用后发现结果如同我上面注释中写的一样,运行到sec.getUserProperties().put(HttpSession.class.getName(), httpSession);时一直报错

之后又找了一些网站,发现加监听就可以消除这个空值错误,但是这样获得的session每次都是新的,并不是我需要的那个。

至今还没有找到好的办法。

三、目前解决方法:

所以退而求其次,使用了在url中传递参数的方法:

在聊天室jsp页面中,获取登录页面传递过来的用户名:<p hidden="hidden" name="username" id="username">${requestScope.username }</p>

在聊天室的js中,设置WebSocket的时候,获取该用户名并加入url后面:

var username =$("#username").text();

var ws = new WebSocket("ws://127.0.0.1:8080/ChatRoom/webSocket/"+username); 

之后在WebSocket处理页面的onOpen中对变量user赋值:

public class WebSocketDemo {

private String user;

@OnOpen    //当客户端连接成功后的回调,参数Session是可选参数,这个Session是WebSocket中的会话,表示一次会话,而不是HTTPSession
public void onOpen(@PathParam(value="username") String username ,Session session){
user = username;
this.session=session;
webSocketSet.add(this);
String message = String.format("%s:%s", user, "加入聊天室");
broadcast(message);
}

……

}

这个user在后面的其它方法中也可以调用

目前为止已经实现了最简陋的传递用户名功能,filter等还在进一步完善中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: