javascript - 通过 HTTPS 的 Web 套接字
问题描述
我是网络套接字编程的新手。实际上,我使用 Angular-8 和 Rest -API 和 Spring boot 构建了一个 Web 应用程序。一切都按预期在本地工作,这意味着在 HTTP 上。但我无法通过 HTTPS(生产服务器)建立套接字连接。我正在使用的库:
Angular ---> Stomp.js & Stomp-client
Spring ----> spring-boot-starter-websocket
服务器---> Nginx
下面是它的代码。
// 套接字服务.ts
import { Injectable, NgZone } from '@angular/core';
import * as Stomp from 'stompjs';
import * as SockJS from 'sockjs-client';
import { Router } from '@angular/router';
import { environment } from 'src/environments/environment';
@Injectable()
export class SocketService {
private socketUrl = environment.serviceUrl+'socket?user=';
private stompClient = null;
constructor(private route: Router, private ngZone: NgZone) {
}
_connect(emailId) {
let ws = new SockJS(this.socketUrl + emailId);
// disconnect previous socket
this._disconnect();
this.stompClient = Stomp.over(ws);
let that = this;
this.stompClient.connect({}, function (frame) {
//subscribe to get response from server
that.stompClient.subscribe('/user/queue', (message) => {
let response = JSON.parse(message.body);
that.ngZone.run(() => {
if (response['code'] == 1) {
localStorage.setItem('token', response['newToken']); // new token with expiry 2 hour
localStorage.setItem('emailId', response['username']);
that.route.navigate(['/pages/dashboard']);
//disconnect the socket
that._disconnect();
}
});
});
});
}
_disconnect() {
if (this.stompClient !== null) {
this.stompClient.disconnect();
}
}
}
// SocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketConfig.class);
public static final String ENDPOINT_CONNECT = "neoeyed/socket";
public static final String SUBSCRIBE_USER_PRIVATE = "/private";
public static final String SUBSCRIBE_USER_REPLY = "/reply";
public static final String SUBSCRIBE_QUEUE = "/queue";
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint(ENDPOINT_CONNECT).setHandshakeHandler(new
CustomSocketPrincipalHandler())
.setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker(SUBSCRIBE_QUEUE, SUBSCRIBE_USER_REPLY, "/topic", "/user");
config.setApplicationDestinationPrefixes(SUBSCRIBE_USER_PRIVATE);
}
// various listeners for debugging purpose
@EventListener
public void handleSubscribeEvent(SessionSubscribeEvent event) {
LOGGER.info("<==> handleSubscribeEvent: username=" + event.getUser().getName() + ", event=" +
event);
}
@EventListener
public void handleConnectEvent(SessionConnectEvent event) {
LOGGER.info("===> handleConnectEvent: username=" + event.getUser().getName() + ", event=" +
event);
}
@EventListener
public void handleDisconnectEvent(SessionDisconnectEvent event) {
LOGGER.info("<=== handleDisconnectEvent: username=" + event.getUser().getName() + ", event="
+ event);
}
}
// 自定义-nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
location / {
proxy_pass example.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
}
}
谢谢你。 https://example.com在有效的 ssl 证书上运行
解决方案
推荐阅读
- azure-data-explorer - Kusto 查询用于检查某个标签是否不存在
- javascript - 在 e2e 测试 NestJS 时使用测试数据库
- node.js - 猫鼬 | 在 pre('save') 钩子中操作文档
- python - 使用 matplotlib 绘制 3D 曲面时出现问题
- wordpress - 使用 .mod_rewrite 将特定参数重定向到子目录
- jquery - 如何在更改输入时在 Django 中“添加另一行”
- react-native - 通过 react-navigation 从 App.js 反应 Native 道具到 Screen 不起作用
- c++ - 使用cmake导入opencv c++文件时出错
- javascript - 如何在jQuery中添加淡入效果
- python - 熊猫数据框分组删除列