您的位置:首页 > 编程语言 > Java开发

java使用Websocket获取HttpSession出现的问题与解决

2017-12-19 09:20 381 查看

websocket的写法就不多说了,主要记一记其中出现的问题

1.获取不到httpSession

解决办法:先重写握手方法,将httpsession放入ServerEndpointConfig.getUserProperties()方法返回的map中

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;

/**
* 继承websocket配置类,将httpsession放入ServerEndpointConfig的map中
* 从而达到使websocket对象可以访问到httpsession中的对象
*/
public class GetHttpSessionConfigurator extends Configurator{

/**
* 重写修改握手方法
* @param sec
* @param request
* @param response
*/
@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
HttpSession httpSession = (HttpSession)request.getHttpSession();
sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
}
}

然后在注解@ServerEndpoint加入configurator的配置

  @ServerEndpoint(value="/websocket",configurator=GetHttpSessionConfigurator.class) 

此时已经可以获取到httpsession了。

然而如果我没有登录,反而需要临时登录这种情况呢?根据上述demo,会发现根本没办法连接上,一直是close状态

下面是对这个问题的解决

2、未登录用户连接WebSocket,一直close状态的情况解决:

解决方法是建立个请求监听器
@WebListener
public class RequestListener implements ServletRequestListener {

public void requestInitialized(ServletRequestEvent sre)  {
//将所有request请求都携带上httpSession
((HttpServletRequest) sre.getServletRequest()).getSession();

}
public RequestListener() {
// TODO Auto-generated constructor stub
}

public void requestDestroyed(ServletRequestEvent arg0)  {
// TODO Auto-generated method stub
}
}

问题解决。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐