2015-07-26 9 views
5

के साथ ठीक लगता है मैं एक एम्बेडेड जेट्टी (9.3.0.v20150612) में एक सर्वलेट लागू कर रहा हूं और मैं HTTP/2 का उपयोग करना चाहता हूं।एम्बेडेड जेट्टी HTTP/2 फ़ायरफ़ॉक्स/क्रोम के साथ काम नहीं कर रहा है लेकिन सफारी

मैं HTTP1.1 या HTTP2 का चयन करने के लिए प्रोटोकॉल वार्ता के लिए एएलपीएन सक्षम कर रहा हूं। जब मैं सफारी 8 (केवल HTTP1.1 का समर्थन करता हूं) या सफारी 9 से अपने सर्वलेट को HTTP अनुरोध भेज रहा हूं (HTTP1.1 & HTTP2 दोनों का समर्थन करें) मुझे अपने सर्वलेट से एक उत्तर मिलता है। जब मैं फ़ायरफ़ॉक्स 39 से एक ही अनुरोध निष्पादित करता हूं, तो यह काम नहीं करता है और मुझे बस NS_ERROR_ABORT मिलता है। मेरे पास क्रोम के साथ एक ही समस्या है।

  1. मैं क्यों नहीं सफारी 9 के साथ क्रोम & फ़ायरफ़ॉक्स से जवाब मिलता है
  2. कैसे पता करूं कि पता कर सकते हैं, HTTP/2 के बजाय HTTP1.1 का इस्तेमाल किया गया है:

    मैं दो प्रश्न हैं? (मेरे IOS9 अनुप्रयोग भी मुद्दे के बिना कनेक्ट कर रहा है)

नीचे जब मैं सर्वर शुरू कर जेट्टी

private void startHTTP2Server() { 
    WebServerProperties webProperties = WebServerProperties.getInstance(); 

    HttpConfiguration config = getHttpConfiguration(); 

    HttpConnectionFactory http1 = new HttpConnectionFactory(config); 
    HTTP2ServerConnectionFactory http2 = new HTTP2ServerConnectionFactory(config); 

    NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable(); 
    ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory(); 
    alpn.setDefaultProtocol(http1.getProtocol()); // sets default protocol to HTTP 1.1 

    // SSL Connection Factory 
    SslContextFactory sslContextFactory = new SslContextFactory(); 
    sslContextFactory.setKeyStorePath(webProperties.getKeystore()); 
    sslContextFactory.setKeyStorePassword(webProperties.getKeystorePassword()); 
    //sslContextFactory.setKeyManagerPassword(KEYSTORE_PW); 
    //sslContextFactory.addExcludeCipherSuites(".*RC4.*"); 
    //sslContextFactory.addExcludeCipherSuites("TLS_DHE_RSA.*"); 
    sslContextFactory.setProtocol(webProperties.getTLSVersion()); // SEB 
    SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol()); 

    Server server = new Server(); 
    //ServerConnector connector = new ServerConnector(server, ssl, alpn, http2, http1); 
    ServerConnector connector = new ServerConnector(server, ssl, alpn, http2, http1); 
    connector.setPort(webProperties.getPort()); 
    server.addConnector(connector); 

    // --- SEB 
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    context.setContextPath(webProperties.getServletContext()); 
    context.setResourceBase(System.getProperty(webProperties.getServletTmpDir())); 
    server.setHandler(context); 

    // Add dump servlet 
    context.addServlet(IMonServer.class, webProperties.getServletPath()); 

    try { 
     server.start(); 
     server.join(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private static HttpConfiguration getHttpConfiguration() { 
    WebServerProperties webProperties = WebServerProperties.getInstance(); 
    HttpConfiguration config = new HttpConfiguration(); 
    config.setSecureScheme("https"); 
    config.setSecurePort(webProperties.getPort()); 
    config.setSendXPoweredBy(true); 
    config.setSendServerVersion(true); 
    config.addCustomizer(new SecureRequestCustomizer()); 
    return config; 
} 

का आरंभीकरण प्रदर्शन करने के लिए कोड है, मैं भी दे जावा विकल्प -Xbootclasspath/पी: $ installDirectory/lib/alpn-boot-8.1.3.v20150130.jar

क्या कुछ गलत या गुम है? आपकी मदद के लिए धन्यवाद,

सादर,

+0

क्या आप कृपया मदद कर सकते हैं: वेबप्रॉपर्टीज? कौन सा आयात/जार? –

उत्तर

6

आपका कोड सही है, यह सिर्फ दो और लाइनों है कि प्राप्त करने के लिए HTTP/2 सही ढंग से काम करने के लिए महत्वपूर्ण हैं का अभाव है।

जब आप SslContextFactory कॉन्फ़िगर, पंक्तियां जोड़ें:

sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); 
    sslContextFactory.setUseCipherSuitesOrder(true); 

क्या इन दो पंक्तियों कर दूसरों से पहले HTTP/2 लोगों को पसंद करते हैं टीएलएस सिफर सॉर्ट करने के लिए है, और है कि आदेश का सम्मान करने के पूछने के लिए ।

सॉर्टिंग के बिना, सर्वर HTTP/2 (h2-14) के पुराने ड्राफ़्ट संस्करण पर वापस आ रहा था जो सिफर की शक्ति को लागू नहीं करता था, लेकिन दुर्भाग्यवश क्रोम और फ़ायरफ़ॉक्स द्वारा अस्वीकार कर दिया गया था।

मुझे नहीं पता कि यह सफारी के साथ क्यों काम कर रहा है: या तो सफारी बग, या अन्य ब्राउज़रों के संबंध में सिफर शक्ति के संबंध में HTTP/2 विनिर्देश की अधिक आराम से व्याख्या।

+0

बहुत बहुत धन्यवाद, यह इस बदलाव के साथ फ़ायरफ़ॉक्स और क्रोम के साथ वास्तव में अच्छा काम करता है! एक और सवाल, यदि मैं http 1.1 या http/2 का उपयोग कर किसी अनुरोध को संसाधित कर रहा हूं, तो मैं सर्वर पक्ष (जेटी में कुछ लॉग के साथ) कैसे जांच सकता हूं? – sebastien

+0

सामान्य रूप से, 'HttpServletRequest.getProtocol()' HTTP प्रोटोकॉल संस्करण स्ट्रिंग को वापस कर देगा। अंतर्निहित सर्वर पक्ष जेटी के एनसीएसए लॉगर को लॉगिंग करने के लिए, https://www.eclipse.org/jetty/documentation/current/embedded-examples.html – sbordet

+0

फिर से धन्यवाद! HttpServletRequest.getProtocol() के साथ मैंने सत्यापित किया है कि मेरा आईओएस 9 ऐप वास्तव में HTTP/2 का उपयोग कर रहा है – sebastien

संबंधित मुद्दे