java - 带有 Jetty 的 SPDY "Hello server"

标签 java jetty spdy

我正在尝试使用 Jetty 在 SPDY 服务器上设置一个最小的 HTTP , 用于测试目的。我正在处理这段代码:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.spdy.http.HTTPSPDYServerConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class MySPDYHelloServer {
    public static void main(String[] args) throws Exception {
        Server server = new Server();

        SslContextFactory sslFactory = new SslContextFactory();
        sslFactory.setKeyStorePath("dummy_keystore.jks");
        sslFactory.setKeyStorePassword("password");
        sslFactory.setProtocol("TLSv1");

        Connector connector = new HTTPSPDYServerConnector(sslFactory);
        connector.setPort(8443);
        server.addConnector(connector);

        server.setHandler( new AbstractHandler(){
            public void handle(String target, Request baseRequest,
                    HttpServletRequest request, HttpServletResponse response)
                    throws IOException, ServletException {
                response.setContentType("text/html;charset=utf-8");
                response.setStatus(HttpServletResponse.SC_OK);
                baseRequest.setHandled(true);
                response.getWriter().println("<h1>Hello World</h1>");
            }
        } );

        server.start();
        server.join();
    }
}

我生成了 keystore :

keytool -genkey -keystore dummy_keystore.jks

当我将 Google Chrome(已启用 SPDY)指向 https://localhost:8443 时,它会警告我证书不受信任,然后永远加载。

纯 SPDY 客户端-服务器示例(来自 here)可以工作,一个简单的 HTTPS 服务器也可以;这个问题似乎与 HTTPSPDYServerConnector 有关类。

这是我正在使用的 JAR 列表:

jetty-all-7.6.7.v20120910.jar
npn-boot-7.6.2.v20120308.jar
servlet-api-2.5.jar
spdy-core-7.6.7.v20120910.jar
spdy-jetty-7.6.7.v20120910.jar
spdy-jetty-http-7.6.7.v20120910.jar

关于我的 Java 环境:

$ cat /opt/jdk1.7.0_07/release 
JAVA_VERSION="1.7.0"
OS_NAME="Linux"
OS_VERSION="2.6"
OS_ARCH="i586"

解决方案附录

jesse mcconnell提供 answer ,无论如何,使用 Eclipse 的人可能会发现以下内容很有用。

JAR npn-boot-7.6.2.v20120308.jar 必须(也)放在:

Run Configurations... -> Classpath -> Bootstrap Entries -> Add External JARs

请注意,由于顺序很重要,该条目必须出现在 JRE 系统库之前

最佳答案

启动时,您是否使用 npn-boot 作为引导类路径 jar?

stock jvm 将不支持 npn(下一个协议(protocol)协商)并且 spdy 将无法工作,因此您必须确保 npn-boot jar 与 -Xbootclasspath 选项一起使用。这听起来有点像你的问题,因为你处理证书加载然后它的停顿......当它更多地是 jvm 类的替代然后是典型的依赖时,你将 npn-boot 称为依赖。

关于java - 带有 Jetty 的 SPDY "Hello server",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12689676/

相关文章:

ubuntu - 来自 Ubuntu 14.04 的 NGINX 1.4.7 与最新版本 NGINX 1.8.0

java - 如何使用 Selenium JavascriptExecutor 将 &lt;script&gt; 添加到 Head 中

java - 使用 GeoServer 提供大型栅格服务会导致 JAVA HEAP 内存不足

java - 限制 Jetty 上 Solr 的内存使用

java - 无法从命令行启动jetty

google-chrome - Chrome HTTP2.0 抛出 SPDY PROTOCOL ERROR

java - Bean 生命周期 - afterPropertiesSet()

java - weblogic上的EJB调度自动启动

java - Tomcat:1 场 war ,2 次部署,2 次配置

http - 我们需要在服务器端做些什么来支持 Chrome 的 SPDY 吗?