public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
System.out.println("Before Handshake");
if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
HttpSession session = servletRequest.getServletRequest().getSession(false);
if (session != null) {
//使用拼接ID区分WebSocketHandler,以便定向发送消息
String sessionId = (String) session.getAttribute("WEBSOCKET_SESSSION_ID"); //一般直接保存user实体
if (sessionId!=null) {
attributes.put("WEBSOCKET_SESSSION_ID",sessionId);
}
}
}
return super.beforeHandshake(request, response, wsHandler, attributes);
}
}
HttpSession session = servletRequest.getServletRequest().getSession(false);
这个session 发现 和控制器上用户登录 是 获取的session 不是同一个
@RequestMapping("login")
public ReturnValue login(HttpServletRequest request, HttpServletResponse response) throws Exception {
String userId = request.getParameter("userId");
String proxyId=request.getParameter("proxyId");
String workOrderId=request.getParameter("workOrderId");
String clientType=request.getParameter("clientType");
System.out.println("1".equals(clientType) ? proxyId:userId+"登录");
if(Strings.isBlank(userId)||Strings.isBlank(userId)||Strings.isBlank(userId)||Strings.isBlank(userId)) {
return new ReturnValue(false,"参数异常");
}
HttpSession session = request.getSession(false);
session.setAttribute("WEBSOCKET_SESSSION_ID", "1".equals(clientType)?"P"+proxyId+workOrderId:"U"+userId+workOrderId); //一般直接保存user实体
return new ReturnValue(true);
}
所以导致 一直得不到 WEBSOCKET_SESSSION_ID这个值 ,而且还要注意 getSession(false); 这个方法。自己百度吧,这个问题坑了我一天了。
原因:是因为 我的项目访问地址是 localhost 但是前端代码中websocket 却是 ip地址 导致得到的session 不一样。