前言
最近在公司做的一个项目,在创建 webSocket 连接时,需要先进行用户验证,然后,在 webSocket 连接时,要携带用户验证的 cookie 。各方百度、Google 都没有找到合适的方式方法。最后在 github 上找到了一个demo ,在此记录下。
正题
Springboot 2.0 之后,就已经整合了websocket,直接导入即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
复制代码
- 服务端
@ServerEndpoint(value = "/websocket")
@Component
public class CSocket {
/**
* socket start
*/
@OnOpen
public void onOpen(Session session) {
System.out.println("connection")
}
/**
* socket stop
*/
@OnClose
public void onClose(Session session, CloseReason closeReason) {
logger.info("session = [" + session + "], closeReason = [" + closeReason + "]");
}
/**
* socket message
*/
@OnMessage
public void onMessage(String message) {
System.out.println("receive message is "+message);
}
@OnMessage
public void onBinaryMessage(ByteBuffer message) {
System.out.println("receive byte data");
}
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
}
复制代码
- 客户端
// 连接服务端
String uri = "ws://localhost:8080/websocket";
System.out.println("Connecting to " + uri);
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(ClientSocket.class, URI.create(uri));
} catch (Exception e) {
e.printStackTrace();
}
// 客户端接收类
@ClientEndpoint
public class ClientSocket {
@OnOpen
public void onOpen(Session session) {
}
@OnMessage
public void onMessage(String message) {
}
@OnError
public void onError(Throwable t) {
}
}
复制代码
- webSocket 发送消息
session.getBasicRemote().sendText(message);
复制代码
- webSocket 连接时 传递cookie 和header
public static Session connection(String uri, String cookieValue){
Session session = null;
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
ClientEndpointConfig cec = ClientEndpointConfig.Builder
.create().configurator(new ClientEndpointConfig.Configurator() {
public void beforeRequest(Map<String, List<String>> headers) {
System.out.println("Setting user cookie in beforeRequest ...");
if(null != cookieValue && !cookieValue.isEmpty()){
ArrayList<String> value = new ArrayList<>();
value.add(cookieValue);
// 设置header,
headers.put("cookie", value);
}
}
}).build();
session = container.connectToServer(ClientSocket.class, cec, URI.create(uri));
} catch (Exception e) {
e.printStackTrace();
}
return session;
}
复制代码
总结
在这次的调查中,查找了很多资料,大多数都是说是使用 java-websocket 包,进行连接,在 WebSocketClient 中添加 header 信息,但是我试用了没有好用,可能是我试用的方式不对。最后在 github 找到一个例子,进行测试,完全可用,万事大吉。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END