我在Tomcat 8上通过TLS获取WebSocket连接时遇到了麻烦。
我已设置以下连接器:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
/>
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystorefile="${user.home}/.keystore" keystorePass="password"
/>
在名为&#34; socket&#34;的标准Tomcat servlet中。我在类上使用了@ServerEndpoint注释来创建WebSocket端点。因此,删节版本如下所示:
@ServerEndpoint(value = "/echo")
public class EchoServer {
@OnOpen
public void onOpen(Session session) {
//
}
@OnMessage
public void onMessage(String message, Session session) {
//
}
@OnClose
public void onClose(Session session) {
//
}
}
在我的客户端,我有一个连接WebSocket的HTML脚本:
var webSocket = new WebSocket("ws://localhost:8080/socket/echo");
当我连接到http://localhost:8080/socket时,一切正常。我可以打开套接字连接并来回传递消息。
使用https://localhost:8443/socket我可以连接到servlet,但我无法打开套接字连接,因为这是一个不安全的操作。然后我尝试将连接字符串更改为:
var webSocket = new WebSocket("wss://localhost:8443/socket/echo");
但是像这样,我无法建立任何联系。
当我查看Tomcat文档(https://tomcat.apache.org/tomcat-8.0-doc/web-socket-howto.html)时,我不明白我需要改变什么 - 我看到一些提及SSL_CONTEXT之类的东西,但我找不到任何一个如何使用它的例子(我有无论如何都没有ClientEndpointConfig,因为那是浏览器?)。
有人能指出我的解决方案吗? 为什么http端口上的连接正常工作在https端口不起作用?