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

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 不一样。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的 Spring Boot 集成 WebSocket 的 Demo,可以实现简单的对话功能: 1. 首先,在 pom.xml 中引入 Spring BootWebSocket 的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 创建一个 WebSocket 配置类,用于配置 WebSocket 相关的内容: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new WebSocketHandler(), "/chat"); } } ``` 3. 创建一个 WebSocketHandler 类,用于处理 WebSocket 的连接和消息: ```java public class WebSocketHandler extends TextWebSocketHandler { private final List<WebSocketSession> sessions = new ArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } } ``` 4. 在 Controller 中添加一个映射,用于返回聊天页面: ```java @Controller public class ChatController { @GetMapping("/") public String index() { return "chat"; } } ``` 5. 创建一个 HTML 页面,用于展示聊天界面和发送消息: ```html <!DOCTYPE html> <html> <head> <title>Chat</title> </head> <body> <div id="messages"></div> <form id="message-form"> <input type="text" id="message-input"> <button type="submit">Send</button> </form> <script src="/webjars/jquery/jquery.min.js"></script> <script src="/webjars/sockjs-client/sockjs.min.js"></script> <script src="/webjars/stomp-websocket/stomp.min.js"></script> <script> var stompClient = Stomp.over(new SockJS("/chat")); stompClient.connect({}, function() { stompClient.subscribe("/chat", function(message) { $("#messages").append("<p>" + message.body + "</p>"); }); }); $("#message-form").submit(function(event) { event.preventDefault(); var message = $("#message-input").val(); stompClient.send("/chat", {}, message); $("#message-input").val(""); }); </script> </body> </html> ``` 这个 Demo 中,前端使用了 SockJS 和 STOMP.js 这两个库来实现 WebSocket 的连接和消息发送。后端使用了 Spring BootWebSocket 功能来处理 WebSocket 的连接和消息。前端和后端通过 /chat 这个 URL 进行连接。 这个 Demo 可以在本地启动后,通过访问 http://localhost:8080/ 来进入聊天界面。多个浏览器窗口之间可以进行简单的对话。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值