From 89ceb7d342d9d35eada8783a7e468ea27c6b616e Mon Sep 17 00:00:00 2001
From: yq183 <645046984@qq.com>
Date: Tue, 14 Jan 2025 11:14:36 +0800
Subject: [PATCH] websocket
---
yq-framework/pom.xml | 7 +++
.../yq/framework/config/SecurityConfig.java | 2 +-
.../web/webSocket/MyWebSocketHandler.java | 48 +++++++++++++++++++
.../web/webSocket/MyWebSocketInterceptor.java | 39 +++++++++++++++
.../web/webSocket/SpringWebSocketConfig.java | 24 ++++++++++
5 files changed, 119 insertions(+), 1 deletion(-)
create mode 100644 yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketHandler.java
create mode 100644 yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketInterceptor.java
create mode 100644 yq-framework/src/main/java/yq/framework/web/webSocket/SpringWebSocketConfig.java
diff --git a/yq-framework/pom.xml b/yq-framework/pom.xml
index 00e318f..8429728 100644
--- a/yq-framework/pom.xml
+++ b/yq-framework/pom.xml
@@ -29,6 +29,13 @@
spring-boot-starter-aop
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+
com.alibaba
diff --git a/yq-framework/src/main/java/yq/framework/config/SecurityConfig.java b/yq-framework/src/main/java/yq/framework/config/SecurityConfig.java
index a4c9d74..ad09ca8 100644
--- a/yq-framework/src/main/java/yq/framework/config/SecurityConfig.java
+++ b/yq-framework/src/main/java/yq/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求
.authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
- .antMatchers("/login", "/register", "/captchaImage","/nologin/**","target/classes/**","/**/*.png").permitAll()
+ .antMatchers("/login", "/register", "/captchaImage","/nologin/**","/ws/**","target/classes/**","/**/*.png").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
diff --git a/yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketHandler.java b/yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketHandler.java
new file mode 100644
index 0000000..ae1dc24
--- /dev/null
+++ b/yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketHandler.java
@@ -0,0 +1,48 @@
+package yq.framework.web.webSocket;
+
+import org.springframework.web.socket.*;
+
+/**
+ * @auther yq
+ * @data 2025/1/13
+ */
+public class MyWebSocketHandler implements WebSocketHandler {
+
+ //建立新的 socket 连接后回调的方法
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ System.out.println("新连接");
+ //从session中获取存放的参数
+ session.getAttributes().get("id");
+ }
+
+ // 接收客户端发送的 Socket
+ @Override
+ public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {
+ // 连接发送的消息
+ String msg = message.getPayload().toString();
+ System.out.println("收到的消息:" + msg+"来自客户端:"+session.getId());
+ // 通过session向连接发送消息
+ session.sendMessage(new TextMessage("我收到了你的消息,感谢你的来信"));
+ }
+
+ //连接出错时,回调的方法
+ @Override
+ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+ System.out.println("收到的错误信息:" + exception);
+ }
+
+ //连接关闭时,回调的方法
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
+ System.out.println("断开连接");
+ }
+
+
+ // WebSocketHandler 是否处理部分消息 默认返回false即可
+ @Override
+ public boolean supportsPartialMessages() {
+ return false;
+ }
+
+}
diff --git a/yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketInterceptor.java b/yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketInterceptor.java
new file mode 100644
index 0000000..16bacce
--- /dev/null
+++ b/yq-framework/src/main/java/yq/framework/web/webSocket/MyWebSocketInterceptor.java
@@ -0,0 +1,39 @@
+package yq.framework.web.webSocket;
+
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+
+/**
+ * @auther yq
+ * @data 2025/1/13
+ */
+public class MyWebSocketInterceptor implements HandshakeInterceptor {
+ @Override
+ public boolean beforeHandshake(ServerHttpRequest servletRequest, ServerHttpResponse servletResponse, WebSocketHandler wsHandler, Map attributes) throws Exception {
+ System.out.println("websocket前置拦截");
+
+ // //如果用到Sec-WebSocket-Protocol,可以采用getHeaders().get(key)的方法获取
+ // if (servletRequest.getHeaders().get("Sec-WebSocket-Protocol") == null) {
+ // System.out.println("无Sec-WebSocket-Protocol,进行拦截!");
+ // return false;
+ // }
+ // String protocol = servletRequest.getHeaders().get("Sec-WebSocket-Protocol").get(0);
+
+ //如果uri的路径中带有参数,可获取到uri字符串,采用截取的方式处理,最后存入attributes
+ String path = servletRequest.getURI().getPath();
+ String id = path.substring(path.lastIndexOf('/') + 1);
+ attributes.put("id", id);
+ System.out.println("设备id:" + id);
+
+ return true;
+ }
+
+ @Override
+ public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
+ System.out.println("websocket后置拦截");
+ }
+}
diff --git a/yq-framework/src/main/java/yq/framework/web/webSocket/SpringWebSocketConfig.java b/yq-framework/src/main/java/yq/framework/web/webSocket/SpringWebSocketConfig.java
new file mode 100644
index 0000000..ff9adca
--- /dev/null
+++ b/yq-framework/src/main/java/yq/framework/web/webSocket/SpringWebSocketConfig.java
@@ -0,0 +1,24 @@
+package yq.framework.web.webSocket;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+/**
+ * @auther yq
+ * @data 2025/1/13
+ */
+@Configuration
+@EnableWebSocket
+public class SpringWebSocketConfig implements WebSocketConfigurer {
+
+ @Override
+ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+ System.out.println("注册websocket");
+ //固定连接路径则使用/ws,如/ws后还有参数,则追加/*通配符
+ registry.addHandler(new MyWebSocketHandler(), "/ws/*")//设置连接路径和处理器
+ .setAllowedOrigins("*") //允许跨域访问
+ .addInterceptors(new MyWebSocketInterceptor());//设置拦截器
+ }
+}