系列文章目录
WebSocket(一):基于Spring Boot项目配合H5标准的WebSocket服务端
WebSocket(二):完全基于Spring Boot项目的WebSocket服务端
@[TOC](文章目录)
前言
此系列文章为记录使用WebSocket的相关过程,如有错误的地方,还请指正。
一、使用步骤
springboot整合的WebSocket服务功能更加强大
1.引入库
<!--spring boot starter websocket已经包含了此依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.编写Spring Boot启动入口
注意:因为我的WebSocket在其他的maven module模块,所以我这里才加了@SpringBootApplication的扫描包路径,所以WebSocket的实现如果是在@SpringBootApplication类的同包或子包下,就不用加扫描,Spring Boot默认扫描自身的包及子包路径。@SpringBootApplication(scanBasePackages = "cn.test.websocket")
public class MainApp {
public static void main(String[] args) {
SpringApplication.run(MainApp.class);
}
2.编写WebSocket服务端
编写配置WebSocket配置类import com.mediacomm.skylink.web.handler.SpringWebSocketHandler;
import com.mediacomm.skylink.web.interceptor.SpringWebSocketHandlerInterceptor;
import org.springframework.context.annotation.Bean;
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;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(getSpringWebSocketHandler(), "/mq-server/server")
.addInterceptors(getInterceptor()).setAllowedOrigins("*");
}
@Bean
public SpringWebSocketHandler getSpringWebSocketHandler() {
return new SpringWebSocketHandler();
}
@Bean
public SpringWebSocketHandlerInterceptor getInterceptor() {
return new SpringWebSocketHandlerInterceptor();
}
}
编写消息处理器
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class SpringWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) {
System.out.println("建立websocket连接" + session);
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) {
System.out.println("接收到客户端消息:" + message);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
System.out.println("连接断开");
}
}
编写拦截器
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map;
public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes){
//这里拦截的是请求升级websocket的http
System.out.println("拦截请求:前");
//返回true就会建立连接,false则反之
//所以可以在这里设置http请求的参数的用户名和密码
///然后通过request.getURI(),用字符串分割后获取参数
//如果要把参数往下传递给SpringWebSocketHandler,可以将参数放入attributes域中
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
System.out.println("拦截请求:后");
}
}
三、总结
参考:官方文档