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小白-北极冰雪: