1.引入依赖
<!--websocket-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.配置Spring Cloud Gateway路由
//sharding-server为转发到的服务名
- id: sharding-admin-ws
#uri: lb:ws://sharding-server
uri: grayLb://sharding-server
predicates:
- Path=/websocket/**
3.配置WebSocketConfig
EnableWebSocket开启websocket
@EnableWebSocket
@Configuration
public class WebSocketConfig{
@Bean
public ServerEndpointExporter endpointExporter() {
return new ServerEndpointExporter();
}
}
4.编写ServerEndpoint端点
@Component
@Slf4j
@Service
@ServerEndpoint(value = "/websocket/{token}/{clientId}")
public class WebSocketServerUtil {
/**
* 前端连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("token") String token, @PathParam("clientId") String clientId) {
}
/**
* 前端连接关闭调用的方法
* 可以在里面写一些关闭连接需要处理的逻辑
*/
@OnClose
public void onClose() {
}
/**
* 该方法用于接受客户端发送的消息
* 当前逻辑是:相同 clientId 的连接可以接受消息
*/
@OnMessage
public void onMessage(String message, Session session) {
}
/**
* 用于记录发生的错误
*/
@OnError
public void onError(Session session, Throwable e) {
}
}
5.忽略权限验证
1.设置全局忽略权限
.antMatchers("/websocket/**").permitAll()
2.在对应子微服务也忽略权限
@Bean
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
return new AuthorizeRequestsCustomizer() {
@Override
public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry) {
// 设置 websocket 无需认证
registry.antMatchers("/websocket/**").permitAll();
}
};
}
6.不忽略权限验证
有两种方式:
1.先全局忽略,然后通过ws:127.0.0.1:80/websocket/token/clientId访问时,传入token,在@Onopen时验证token有效性
2.全局验证,获取到token解析。。。。。。。。。。。。。
7.访问路径
ws:127.0.0.1:80/websocket/token/clientId