前端后端需要建立websocket连接,但是出现了跨域问题(应该是跨域问题),局域网内可以连接到,局域网外就只能访问页面但不能建立websocket连接,以下是具体前后端代码(后端使用ipv6地址进行访问)
@ServerEndpoint(value = "/ws/{sid}")
@Slf4j
@Component
public class WebSocketServer {
private static int onlineCount = 0;
private static Map<String, WebSocketServer> clients = new ConcurrentHashMap<>();
private Session session;
private String sid;
@OnOpen
public void onOpen(@PathParam("sid") String sid, Session session) {
this.sid = sid;
this.session = session;
WebSocketServer.onlineCount++;
clients.put(sid, this);
log.info("连接到客户端:{}", sid);
}
@OnClose
public void onClose() {
clients.remove(sid);
WebSocketServer.onlineCount--;
log.info("断开连接:{}", sid);
}
@OnMessage
public void onMessage(String message) {
log.info("收到客户端消息:{}", message);
}
@OnError
public void onError(Session session, Throwable throwable) {
log.error("WebSocket发生错误:{}", throwable.getMessage());
}
public static void sent2Client(UserLoginVO userLoginVO, String sid) {
WebSocketServer item = clients.get(sid);
item.session.getAsyncRemote().sendText(JSONUtil.toJsonStr(userLoginVO));
}
}
```java
/**
* WebSocket配置类,用于注册WebSocket的Bean
*/
@Configuration
public class WebSocketConfiguration {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
public void registerStompEndpoints(StompEndpointRegistry registry) {
//addEndpoint表示添加了一个/socket端点,客户端就可以通过这个端点来进行连接。
//withSockJS()的作用是开启SockJS支持(指定使用SockJS协议)
registry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS();
}
}
```vue
createWebSocket() {
console.log('创建websocket连接');
let websocket = null;
let clientId = Math.random().toString(36).substr(2);
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
//连接WebSocket节点
websocket = new WebSocket("ws://[2sge:47e:428:25df:6635:e257:886a:e28c]:8080/ws/" + clientId);
this.sid = clientId;
console.log('websocket连接成功');
} else {
alert('当前浏览器不支持,请更换浏览器!');
}
// 连接成功时
websocket.onopen = () => {
console.log('websocket连接成功')
}
websocket.onmessage = event => {
// 后端发送的消息在event.data中
console.log("接收到后端消息:" + event.data);
let jsonObj = JSON.parse(event.data);
this.userLoginVO.id = jsonObj.id;
sessionStorage.setItem('token', jsonObj.token);
sessionStorage.setItem('userId', jsonObj.id);
console.log("nickname:" + jsonObj.nickname);
this.userLoginVO.nickname = jsonObj.nickname;
this.userLoginVO.username = jsonObj.username;
this.userLoginVO.phone = jsonObj.phone;
this.userLoginVO.avatar = jsonObj.avatar;
// 跳转音乐页面
//设置用户信息
sessionStorage.setItem("nickname", this.userLoginVO.nickname)
sessionStorage.setItem("avatar", this.userLoginVO.avatar)
this.$router.push({
path: '/music',
});
}
websocket.onclose = function () {
console.log('关闭了')
}
// 路由跳转时结束websocket链接
this.$router.afterEach(function () {
//websocket.close()
console.log('路由跳转')
})
// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常
window.onbeforeunload = function () {
websocket.close()
}
},