1.获取httpSession(因为项目需求,要获取ServletContext等)
解决办法:重写修改握手方法
import javax.servlet.http.HttpSession;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;/**
* Purpose: 获取HttpSession
* @author Hermanwang
* @since JDK 1.8
* @date 2018年11月26日
* @MaintenancePersonnel Hermanwang
*/
public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator {
/**
* 重写修改握手方法
* (non-Javadoc)
* @see javax.websocket.server.ServerEndpointConfig.Configurator#modifyHandshake(javax.websocket.server.ServerEndpointConfig, javax.websocket.server.HandshakeRequest, javax.websocket.HandshakeResponse)
*/
@Override
public void modifyHandshake(ServerEndpointConfig sec,
HandshakeRequest request, HandshakeResponse response) {
try {
HttpSession httpSession=(HttpSession) request.getHttpSession();
if(httpSession != null) {
sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
然后修改注解为:
@ServerEndpoint(value="/websocket", configurator=GetHttpSessionConfigurator.class)
获取:private static HttpSession httpSession;
httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
问题2:
服务死掉之后,(前台使用心跳,心跳抓不到HttpSession),或者未登录用户连接WebSocket,一直close状态的情况:
解决办法:建立RequestListener监听.
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;/**
* Purpose: 监听Request
* @author Hermanwang
* @since JDK 1.8
* @date 2018年11月26日
* @MaintenancePersonnel Hermanwang
*/
@WebListener
public class RequestListener implements ServletRequestListener {
/**
* Constructor:空构造
*/
public RequestListener() {
}
/**
* (non-Javadoc)
* @see javax.servlet.ServletRequestListener#requestInitialized(javax.servlet.ServletRequestEvent)
*/
public void requestInitialized(ServletRequestEvent sre) {
//将所有request请求都携带上httpSession
((HttpServletRequest) sre.getServletRequest()).getSession();
}
public void requestDestroyed(ServletRequestEvent arg0) {
}
}
ok!!