如何使用ALPN来运行支持SPDY的Jetty?

3

我已经回到使用JDK8、Jetty和SPDY,我发现现在Jetty 9.2支持ALPN协议而不是NPN(请查看我的问题如何在JDK8上运行支持SPDY的Jetty?)。因此我设置了bootclasspath

java -Xbootclasspath/p:c:/jars/alpn-boot/alpn-boot-8.0.0.v2014031 ...

但是现在我遇到了异常:
Exception in thread "xyz.server" java.lang.NoClassDefFoundError:
        org/eclipse/jetty/npn/NextProtoNego$ServerProvider
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    ...
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:63)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:53)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:43)
    at xyz.my.my_httpsrv_jetty.startHTTPSServer(my_httpsrv_jetty.java:359)
    ...

我使用的是java版本号为"1.8.0_05",jetty版本为9.2.2.v20140723。

在WinXP系统中,我使用JDK 1.7和alpn-boot-7.0.0.v20140317.jar时遇到了相同的错误,在这里我将其从-Xbootclasspath/p:c:/jars/npn-boot/npn-boot-1.1.7.v20140316.jar修改为其他值。

这个异常指向我的代码:

SSLconnector = new HTTPSPDYServerConnector(server, sslContextFactory);

似乎即使使用ALPN,Jetty仍需要npn-boot类。这是一个bug还是我做错了什么?
1个回答

4

HTTPSPDYServerConnector没有更新到ALPN,目前硬编码使用NPN。

为了使用带有SPDY的ALPN,您必须按照以下方式配置ServerConnector

SslContextFactory sslContextFactory = new SslContextFactory();
HttpConfiguration httpConfig = new HttpConfiguration();

SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, "alpn");
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory("spdy/3", "http/1.1");
alpn.setDefaultProtocol("http/1.1");
HTTPSPDYServerConnectionFactory spdy = new HTTPSPDYServerConnectionFactory(SPDY.V3, httpConfig);
HttpConnectionFactory http = new HttpConnectionFactory(httpConfig);

Server server = new Server();
ServerConnector connector = new ServerConnector(server, new ConnectionFactory[]{ssl, alpn, spdy, http});

server.start();

我将其跟踪为https://bugs.eclipse.org/bugs/show_bug.cgi?id=440756

最后,如果您不直接使用代码,而是使用Jetty作为服务器并将Web应用程序部署到其中,则Jetty已根据激活的模块正确配置了ALPN或NPN。


好的。我编辑了我的代码并使用这种启动服务器的方式,似乎可以与SPDY一起工作。谢谢! - Michał Niklas
它可以工作,但我在客户端证书方面遇到了问题。由于长度较长,因此我已经提出了另一个问题:http://stackoverflow.com/questions/25972186/how-to-work-with-client-certificates-on-jetty-spdy-with-alpn - Michał Niklas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接