spring boot实现websocket HttpSessionHandshakeInterceptor session不是同一个问题

public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                                   Map 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 不一样。

你可能感兴趣的:(spring boot实现websocket HttpSessionHandshakeInterceptor session不是同一个问题)