在 grizzly 上设置 websocket SSL
Posted
技术标签:
【中文标题】在 grizzly 上设置 websocket SSL【英文标题】:Setting websocket SSL on grizzly 【发布时间】:2014-09-17 14:51:54 【问题描述】:我正在尝试在 grizzly 容器上使用“javax.websocket.server.ServerEndpoint”配置基于 SSL 的 WebSocket。但是我找不到任何方法将 SSL 属性设置为我的端点。
我的端点代码:
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(
Value="/ptiWs",
decoders = ApiMessage.ApiCoder.class,
)
public class WebsocketEndpoint
private static final Logger LOG = LogManager.getLogger(WebsocketEndpoint.class);
private final ApiVisitorImpl apiVisitor;
public WebsocketEndpoint()
@OnOpen
public void onOpen(Session session)
LOG.info("New connection open : " + session.toString());
@OnMessage
public void message(Session session, ApiMessage message)
LOG.info("New message arrive " + message.toString());
最后,我使用以下代码将端点添加到我的 Grizzly 实例:
Server ptiWebsocket = new Server("localhost", 8025, "/", null, WebsocketEndpoint.class);
ptiWebsocket.start();
我已经为 glassfish 完成了这项工作,这很容易,但在这里我找不到任何继续的方法。
还有依赖:
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.glassfish.tyrus</groupId>
<artifactId>tyrus-server</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.glassfish.tyrus</groupId>
<artifactId>tyrus-container-grizzly-server</artifactId>
<version>1.7</version>
</dependency>
谢谢
【问题讨论】:
您确定您使用的是 Jetty 吗?这看起来更像是 Tyrus 附带的内置 grizzly 容器支持。 你说得对,Jetty 没有报告这个问题。这实际上是一个灰熊容器。我编辑帖子 【参考方案1】:查看 tyrus 源代码,它似乎不支持开箱即用。您需要创建一个新的 ServerContainerFactory,就像 org.glassfish.tyrus.container.grizzly.server.GrizzlyServerContainer 一样。从 Github 中获取代码。您可以制作自己的 GrizzlySSLServerContainer。然后,您将在 start 方法中将 SSL 配置添加到 NetworkListener。然后,您可以使用 JAR 将新 GrizzlySSLServerContainer 类的完整限定名添加到 META-INF/services/org.glassfish.tyrus.spi.ServerContainerFactory 中,Tyrus 应该会选择它。
这有点hacky,不得不复制/粘贴代码很糟糕,但它应该可以工作。
1.) 将 GrizzlyServerContainer 复制到新的 GrizzlySSLServerContainer 类。
2.) 添加方法以将 SSL 配置数据提供到新的 Container 类中。
3.) 向 NetworkListener 添加数据以实例化 SSL
4.) 将新类添加到 jar 的 META-INF/serivces 目录中。
【讨论】:
因为我怀疑没有对 websocket ssl 的本地支持 :( 我的项目有更改技术,所以我不会测试您的解决方案,但这必须有效。谢谢 有人已经成功完成了吗?我正在开发一个独立使用 Tyrus 和 Grizzly 的 POC,并且需要它是 SSL。第 11 个小时在这里发现; Grizzly 容器中没有 SSL 支持(“wss”)!什么鬼?! 有人做过吗? 似乎仍然无法做到这一点,尽管 Tyrus 是 Java WebSockets 的 RI。我在这里发布了一个问题:***.com/questions/53849572/… 这行得通 - 请参阅我在***.com/a/53867046/17641的评论以上是关于在 grizzly 上设置 websocket SSL的主要内容,如果未能解决你的问题,请参考以下文章
无法加载容器提供程序类:org.glassfish.tyrus.container.grizzly.GrizzlyEngine