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());//设置拦截器 + } +}