import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; import javax.servlet.http.HttpSession; import javax.websocket.HandshakeResponse; import javax.websocket.server.HandshakeRequest; import javax.websocket.server.ServerEndpointConfig; @Configuration public class WebSocketConfig extends ServerEndpointConfig.Configurator{ /* 修改握手,就是在握手协议建立之前修改其中携带的内容 */ @Override public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { HttpSession httpSession = (HttpSession)request.getHttpSession(); if (httpSession != null) { // 读取session域中存储的数据 sec.getUserProperties().put(HttpSession.class.getName(),httpSession); super.modifyHandshake(sec, request, response); @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter();
WebsocketListener.java
import org.springframework.stereotype.Component;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Component
public class WebsocketListener implements ServletRequestListener{
    @Override
    public void requestInitialized(ServletRequestEvent sre)  {
        HttpSession session = ((HttpServletRequest) sre.getServletRequest()).getSession();
    public WebsocketListener(){}
    @Override
    public void requestDestroyed(ServletRequestEvent arg0)  {}
Websocket.java
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.*;
@ServerEndpoint(value = "/websocket",configurator = WebSocketConfig.class)
@Component
public class WebSocket {
    private Session session;
    @OnOpen
    public void onOpen(Session session,EndpointConfig config){
        HaigeSatContext.getInstance().getOnlineWebSocketSessions().add(session);
        System.out.println("-------------websocket open--------------");
        HttpSession httpSession= (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        String httpSessionId = httpSession.getId();
        System.out.println("httpSessionId:"+httpSessionId);
        //此处省略使用sessionId构建hashMap集合存储websocket Session
    @OnClose
    public void onClose(Session session){
        System.out.println("-------------websocket close--------------");
    @OnMessage
    public void OnMessage(String message, Session session){
        System.out.println("-------------recv message--------------");
        System.out.println("message:"+message);
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("---------------websocket error-------------------------");

以上即为websocket获取HttpSession过程,下一篇实现普通类中获取Httpsession来获取对应的websocket Session。

WebsocketConfig.javaimport org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;import javax.servlet.http.HttpSession;im. 一个普通网站,用户登录后,将用户信息存在HttpSession。现在网站需要加入即时聊天功能,打算使用Websocket实现,需要在Websocket拿到HttpSession来表示用户。 * @param chatMessage @MessageMapping("/chat") public void c...
websocket有两个session 一个是自身的 一个是httpsession,由于WebSocket与Http协议的不同,故在使用常用的HttpSession方面就存在了一些问题。通过google翻阅到了在onOpen方法下使用HttpSession的方法 import javax.servlet.http.HttpSession; import javax.websocket.Hand...
(1)建立在 TCP 协议之上,服务器端的实现比较容易。 (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 (3)数据格式比较轻量,性能开销小,通信高效。 (4)可以发送文本,也可以发送二进制数据。 (5)没有同源限制,客户端可以与任意服务器通信...
一:本文适用范围 本文使用J2EE规范原生的WebSocket开发,适用于项目WebSocket的使用比较少的情况,而Spring WebSocket封装的比较繁重,反而不适用于实际项目的情况。 自己在开发时就是由于项目的原因,不想用Spring-WebSocket,所有用了原生的,但是找了好多帖子试了好多方法都不行,甚至将原生的和Spring-WebSocket混用了也是不行,看源...
@Configuration public class WebSocketConfig extends HttpSessionHandshakeInterceptor { @Bean public ServerEndpointExporter serverEndp...
websocket使用握手拦截器 public class HttpSessionHandshakeInterceptor extends org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, W
看到许多博客里都是通过前端建立websocket请求时将用户信息传递给后端并绑定到websocket的实例,这样也能满足需求,但是针对粒度要达到会话级别的时候,同时系统采用异步编程时,这个做法就无法满足业务场景了,同时这对前端还有侵入性。另大多数博客都没讲清原理,此处为加深自己记忆,整理一份文档,助和我曾经一样的小白们快速理解。 场景说明: 1、如果系统收到请求后将数据交给线程池异步执行,并...
websocket如果需要1对1通信,或者说将服务器数据发送到指定的客户端上,就需要给每一个新生成的websocket加上编号。比较常见的,是在地址映射加上编号,比如: @ServerEndpoint(value="/websocket/12") 就代表着编号12的客户端用户。但是这样就需要客户端自行设置一个编号,稍微有些不自然,因此我希望能够自动生成一个编号,并且,我希望他在页面进行刷新时,......
Java SpringBoot WebSocket是一种用于建立实时通信连接的技术。在传统的HTTP请求响应模式下,客户端发送请求,服务器端返回响应,这种模式不能满足现代应用的实时通信需求。这时候WebSocket的出现就可以弥补这个缺陷,通过双向通信的方式使客户端与服务器端进行实时交互。 Java SpringBoot WebSocket提供了一种简单的方式,使得在SpringBoot进行WebSocket开发变得十分容易。它使用了STOMP协议(即简单文本协议),这是一种基于消息代理的协议。 在Java SpringBoot WebSocket开发,我们可以使用Spring的WebSocket API来处理WebSocket消息。我们可以通过使用Java的@MessageMapping注解来处理这些消息,这样就可以封装客户端发送过来的消息和服务器端返回的消息。使用@ControllerAdvice注解可以使得异常信息可以被应用解释并使用。 在WebSocket开发,我们需要注意的是对于一些非幂等操作,我们需要以同步的方式进行操作。例如,如果我们要向客户端发送消息,我们需要确保该消息发送成功,否则我们需要进行重试。 总之,Java SpringBoot WebSocket是一个非常强大的工具,它可以使得在SpringBoot进行WebSocket开发变得十分容易,实现实时通信以及消息代理。对于需要进行实时通信的应用,这是一种非常有利的技术。
IT小白-北极冰雪: JAVA后台实现websocket连接的onOpen(Session session,EndpointConfig config)函数中,参数session指的是当前websocket连接的websocketSession,该session相当于后端websocket往前端推送消息的地址,HttpSession是(HttpSession) config.getUserProperties().get(HttpSession.class.getName())获取,目的用于获取httpSessionId,存储Map<httpSessionId,WebsocketSession>,当用户前端发起请求时,通过遍历Map查找到对应的websockSession,然后向该用户推送消息。