跳转至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等还在进一步完善中
制作了两个简单的页面,一个是用户登录,一个是群聊的聊天室。
首先用户在登录页面输入账号密码登录后自动跳转至聊天室,在聊天室中,我希望能将用户信息带过去。
二、遇到的问题:
首先我想到的是使用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等还在进一步完善中
相关文章推荐
- 【Android初学者】超简单的注册页面,填写完整信息实现 跳转 和 传参
- 使用storyboard实现页面跳转,简单的数据传递
- 使用storyboard实现页面跳转,简单的数据传递
- iOS中使用storyboard实现页面跳转,Segue详解及简单的数据传递
- Android中页面跳转,并传递信息
- 使用storyboard实现页面跳转,简单的数据传递
- Android中页面跳转,并传递信息
- 简单知识——跨页面信息传递
- [转]使用storyboard实现页面跳转,简单的数据传递
- (4.4.1)使用storyboard实现页面跳转,简单的数据传递
- 使用storyboard实现页面跳转,简单的数据传递(转载)
- (4.4.1)使用storyboard实现页面跳转,简单的数据传递
- 使用storyboard实现页面跳转,简单的数据传递
- 关于Fragment之间页面跳转时的extra信息的传递
- 简单实现iphone页面跳转和页面间数据传递
- 【iOS界面处理】使用storyboard实现页面跳转,简单的数据传递
- 使用storyboard实现页面跳转,简单的数据传递
- 使用storyboard实现页面跳转,简单的数据传递
- 简单实现iphone页面跳转和页面间数据传递
- 【转】使用storyboard实现页面跳转,简单的数据传递