鍒涘緩涓€涓渶綆€鍗曠殑Web搴旂敤錛屼嬌瀹冨湪鏍圭洰褰曚笅鍖呭惈涓€涓枃鏈枃浠秈ndex錛屽唴瀹逛負(fù)"HTTP/2 Test"銆?/span>鍐嶅寘鍚竴涓畝鍗曠殑Servlet錛屼唬鐮佸涓嬶細(xì)
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 5222793251610509039L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("Test");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
web.xml涓昏鏄畾涔変簡涓€涓猄ervlet錛屽叿浣撳唴瀹瑰涓嬶細(xì)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
metadata-complete="false" version="3.1">
<welcome-file-list>
<welcome-file>index</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
</web-app>
璇ュ簲鐢ㄧ殑閮ㄧ講璺緞涓簀etty-9.3.11/test-base/webapps/test.war銆傚湪璇AR鏂囦歡鎵€鍦ㄧ殑鐩綍涓嬶紝鍒涘緩涓€涓猼est.xml錛屽叾鍐呭濡備笅鎵€紺猴細(xì)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war"><SystemProperty name="jetty.base" default="."/>/webapps/test.war</Set>
</Configure>
鍚姩Jetty鏈嶅姟鍣紝浣跨敤榛樿鐨凥TTP鍜孒TTPS绔彛錛屽垎鍒負(fù)8080鍜?443銆?/span>
$ java -jar ../start.jar
2016-09-15 21:15:51.190:INFO:oejs.Server:main: jetty-9.3.11.v20160721
2016-09-15 21:15:51.237:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///D:/http2/jetty/jetty-9.3.11/test-base/webapps/] at interval 1
2016-09-15 21:15:52.251:INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /test.war, did not find org.eclipse.jetty.jsp.JettyJspServlet
2016-09-15 21:15:52.313:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@4520ebad{/test.war,file:///D:/http2/jetty/jetty-9.3.11/test-base/webapps/test.war/,AVAILABLE}{D:\http2\jetty\jetty-9.3.11\test-base\webapps\test.war}
2016-09-15 21:15:52.391:INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2016-09-15 21:15:52.391:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@711f39f9{/,file:///D:/http2/jetty/jetty-9.3.11/test-base/webapps/test.war/,AVAILABLE}{/test.war}
2016-09-15 21:15:52.532:INFO:oejs.AbstractConnector:main: Started ServerConnector@1b68ddbd{HTTP/1.1,[http/1.1, h2c, h2c-17, h2c-16, h2c-15, h2c-14]}{0.0.0.0:8080}
2016-09-15 21:15:52.735:INFO:oejus.SslContextFactory:main: x509=X509@e320068(jetty,h=[jetty.eclipse.org],w=[]) for SslContextFactory@1f57539(file:///D:/http2/jetty/jetty-9.3.11/test-base/etc/keystore,file:///D:/http2/jetty/jetty-9.3.11/test-base/etc/keystore)
2016-09-15 21:15:52.735:INFO:oejus.SslContextFactory:main: x509=X509@76f2b07d(mykey,h=[],w=[]) for SslContextFactory@1f57539(file:///D:/http2/jetty/jetty-9.3.11/test-base/etc/keystore,file:///D:/http2/jetty/jetty-9.3.11/test-base/etc/keystore)
2016-09-15 21:15:53.234:INFO:oejs.AbstractConnector:main: Started ServerConnector@4b168fa9{SSL,[ssl, alpn, h2, h2-17, h2-16, h2-15, h2-14, http/1.1]}{0.0.0.0:8443}
2016-09-15 21:15:53.249:INFO:oejs.Server:main: Started @3940ms
鏍規(guī)嵁涓婅堪鏃ュ織鍙煡錛孞etty鍚敤浜哤eb搴旂敤test.war錛岃繕鍚姩浜嗕袱涓猄erverConnector錛屼竴涓敮鎸乭2c錛屽彟涓€涓敮鎸乭2銆傚€煎緱娉ㄦ剰鐨勬槸錛岃繖涓や釜ServerConnector榪樺垎鍒敮鎸乭2c-17, h2c-16, h2c-15, h2c-14鍜宧2-17, h2-16, h2-15, h2-14銆傝繖鏄洜涓猴紝HTTP/2鍦ㄦ寮忓彂甯冧箣鍓嶏紝鍏堝悗鍙戝竷浜?8涓崏妗堬紝鍏剁紪鍙蜂負(fù)00-17銆傛墍浠ワ紝榪欓噷鐨刪2c-XX鍜宧2-XX鎸囩殑灝辨槸絎琗X鍙瘋崏妗堛€?/span>
3. 瀹㈡埛绔?/span>
鍏跺疄鏈€鏂逛究鐨勫鎴風(fēng)灝辨槸嫻忚鍣ㄤ簡銆傚彧瑕佷嬌鐢ㄧ殑FireFox鎴朇hrome鐗堟湰涓嶆槸澶€侊紝鑲畾閮藉凡緇忔敮鎸佷簡HTTP/2錛岃€屼笖榪欎竴鍔熻兘鏄粯璁ゆ墦寮€鐨勩€備篃灝辨槸璇達(dá)紝褰撲嬌鐢‵ireFox鍘昏闂墠闈㈡墍閮ㄧ講鐨刉eb搴旂敤鏃訛紝灝辨槸鍦ㄤ嬌鐢℉TTP/2錛屼絾浣犱笉浼?xì)鎰熻鍒皹q欑鍙樺寲銆備嬌鐢‵ireFox鎻愪緵鐨凞eveloper Tools涓殑Network宸ュ叿鏌ョ湅鏈嶅姟鍣ㄧ鐨勫搷搴旓紝浼?xì)鍙戠幇HTTP鐗堟湰涓篐TTP/2.0銆備絾姝ゅ甯屾湜榪欎釜瀹㈡埛绔兘澶熸彁渚涙洿涓轟赴瀵岀殑涓庢湇鍔″櫒绔繘琛屼氦浜掔殑鍔熻兘錛岄偅涔堟祻瑙堝櫒灝卞茍涓嶅悎閫備簡銆?br /> Jetty涔熷疄鐜頒簡鏀寔HTTP/2鐨勫鎴風(fēng)錛屼絾榪欎釜瀹㈡埛绔槸涓€涓狝PI錛岄渶瑕佺紪鍐欑▼搴忓幓璁塊棶HTTP/2鏈嶅姟鍣ㄧ銆傝€屼笖錛岀洰鍓嶈API鐨勮璁℃娊璞″眰嬈¤緝浣庯紝闇€瑕佸簲鐢ㄧ▼搴忓憳瀵笻TTP/2鍗忚錛屾瘮濡傚悇縐嶅撫錛屾湁杈冩繁鍏ョ殑浜嗚В銆傝繖瀵逛簬鍒濇秹HTTP/2鐨勫紑鍙戣€呮潵璇達(dá)紝鏄劇劧寰堜笉鍚堥€傘€傛湰鏂囬€夋嫨浣跨敤C璇█緙栧啓鐨勪竴涓伐鍏鳳紝鍏跺疄涔熸槸HTTP/2鐨勫鎴風(fēng)瀹炵幇涔嬩竴錛宑url銆?/span>
curl鍦ㄦ敮鎸丠TTP/2鏃訛紝瀹為檯涓婃槸浣跨敤浜唍ghttp2鐨凜搴擄紝鎵€浠ラ渶瑕佸厛瀹夎nghttp2銆傚彟澶栵紝涓轟簡璁ヽurl鏀寔h2錛屽氨蹇呴』瑕佹湁TLS-ALPN鐨勬敮鎸併€傞偅涔堬紝涓€鑸湴榪橀渶瑕佸畨瑁匫penSSL 1.0.2+銆?/span>
緗戠粶涓婂叧浜庡湪Linux涓嬪畨瑁呮敮鎸丠TTP/2鐨刢url鐨勮祫婧愭湁寰堝錛岃繃紼嬪茍涓嶉毦錛屼絾鏈夌偣鍎跨箒錛岃瀹夎鐨勪緷璧栨瘮杈冨錛屾湰鏂囧氨涓嶈禈榪頒簡銆傚鏋滄槸浣跨敤Windows錛岀瑪鑰呮瘮杈冩帹鑽愰€氳繃Cygwin鏉ュ畨瑁呭拰浣跨敤curl銆傚湪Windows涓畨瑁匔ygwin闈炲父綆€鍗曪紝鍦–ygwin涓墽琛屽悇縐嶅懡浠ゆ椂錛屾劅瑙変笂灝卞鍚屽湪浣跨敤Linux錛屽敖綆″畠騫朵笉鏄竴涓櫄鎷熸満銆傞€氳繃Cygwin瀹夎curl錛屽畠浼?xì)鑷姩鍦板畨瑁呮墍闇€鐨勫悇縐嶄緷璧栫▼搴忓拰搴撱€?/span>
鍦ㄧ瑪鑰呯殑鏈哄櫒涓婏紝閫氳繃鏌ョ湅curl鐨勭増鏈細(xì)鍑虹幇濡備笅淇℃伅錛?/span>
curl 7.50.2 (x86_64-unknown-cygwin) libcurl/7.50.2 OpenSSL/1.0.2h zlib/1.2.8 libidn/1.29 libpsl/0.14.0 (+libidn/1.29) libssh2/1.7.0 nghttp2/1.14.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: Debug IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets Metalink PSL
鐢變笂鍙煡錛岀瑪鑰呬嬌鐢ㄧ殑curl鐗堟湰鏄?.50.2錛宯ghttp2鐗堟湰鏄?.14.0錛岃€孫penSSL鐗堟湰鏄?.0.2h銆?/span>
4. 絎竴嬈″皾璇?/span>
鍦ㄧ涓€嬈″皾璇曚腑錛屽彧闇€瑕佺畝鍗曞湴璁塊棶絎?鑺備腑閮ㄧ講鐨刉eb搴旂敤涓殑闈欐€佹枃鏈枃浠秈ndex錛屼互鎰熷彈涓媓2c錛屽畬鏁村懡浠ゅ涓嬶細(xì)
$ curl -v --http2 http://localhost:8080/index
鍦ㄨ緭鍑轟腑鍖呭惈鏈夊涓嬬殑鍐呭錛?/span>
...
> GET /index HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.50.2
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
>
...
< HTTP/1.1 101 Switching Protocols
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
...
< HTTP/2 200
< server: Jetty(9.3.11.v20160721)
< last-modified: Wed, 14 Sep 2016 12:52:32 GMT
< content-length: 11
< accept-ranges: bytes
<
...
HTTP/2 Test
">"鏄鎴風(fēng)鍙戦€佺殑璇鋒眰錛?<"鏄湇鍔″櫒绔彂閫佺殑鍝嶅簲錛岃€?*"鏄痗url瀵瑰綋鍓嶈繃紼嬬殑璇存槑銆?/span>緇撳悎鏈郴鍒?a href="http://www.aygfsteel.com/jiangshachina/archive/2016/09/19/431811.html">絎竴綃囨枃绔?/a>涓墍綆€榪扮殑HTTP 2鍗忚錛屽彲浠ユ湁浠ヤ笅鐨勫熀鏈悊瑙c€?/span>
[1]瀹㈡埛绔彂璧蜂簡涓€涓狧TTP/1.1鐨勮姹傦紝鍏朵腑鎼哄甫鏈塙pgrade澶撮儴錛岃姹傛湇鍔″櫒绔崌綰у埌HTTP/2(h2c)銆?/span>
> GET /index HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.50.2
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
>
[2]鏈嶅姟鍣ㄧ鍚屾剰鍗囩駭錛岃繑鍥炲搷搴?101 Switching Protocols"錛岀劧鍚庡鎴風(fēng)鏀跺埌浜?01鍝嶅簲錛孒TTP/2榪炴帴榪涜紜銆?/span>
< HTTP/1.1 101 Switching Protocols
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
[3]鏈嶅姟鍣ㄧ鍝嶅簲鏈€緇堢粨鏋溿€傜姸鎬佽涓嚭鐜扮殑HTTP鐗堟湰涓篐TTP/2錛岀姸鎬佷唬鐮佷負(fù)200錛屼笖鍚庨潰娌℃湁璺熺潃"OK"銆傛渶鍚庤緭鍑轟簡index鏂囦歡鐨勫唴瀹?HTTP/2 Test"銆?/span>
< HTTP/2 200
< server: Jetty(9.3.11.v20160721)
< last-modified: Wed, 14 Sep 2016 12:52:32 GMT
< content-length: 11
< accept-ranges: bytes
<
...
HTTP/2 Test
5. 涓€涓眬闄?/span>
榪欐錛屽湪鍙戣搗鐨勮姹備腑鍖呭惈浣撻儴錛屽懡浠ゅ涓嬶細(xì)
$ curl -v --http2 -d "body" http://localhost:8080/index
鍦ㄨ緭鍑轟腑鍖呭惈鏈夊涓嬬殑鍐呭錛?/span>
...
> POST /index HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.50.2
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
> Content-Length: 4
> Content-Type: application/x-www-form-urlencoded
>
...
< HTTP/1.1 200 OK
< Last-Modified: Wed, 14 Sep 2016 12:52:32 GMT
< Accept-Ranges: bytes
< Content-Length: 11
...
HTTP/2 Test
鍜岀4鑺備腑鐨勮緭鍑鴻繘琛屾瘮杈冿紝浼?xì)鍙戠幇缂簽畱浜?101 Switching Protocols"閭d竴孌碉紝鑰屼笖鏈€緇堝搷搴旂姸鎬佽涓嚭鐜扮殑HTTP鐗堟湰鏄疕TTP/1.1銆傝繖灝辮鏄庢湇鍔″櫒绔笉鍚屾剰鍗囩駭錛屽悗闈㈢戶緇嬌鐢℉TTP/1.1銆傚垰鍒氶儴緗茬殑Jetty鏈仛浠諱綍鏀瑰彉鎬庝箞浼?xì)绐佺劧涓嶆敮鎸丠TTP/2浜嗗憿錛熸垨鑰呰繖鏄痗url鐨勯棶棰橈紵鍏跺疄錛?/span>榪欐槸鍥犱負(fù)Jetty鏈嶅姟鍣ㄧ鍦ㄥ疄鐜癶2c鏃朵笉鏀寔璇鋒眰涓寘鍚綋閮ㄣ€傚彟澶栵紝Apache httpd涔熸湁鍚屾牱鐨勯棶棰樸€傚鏋滄槸浣跨敤h2錛屽垯娌℃湁榪欎釜闄愬埗銆傝繖鑳屽悗鐨勫師鍥犺秴鍑轟簡鏈枃鐨勮寖鐣達(dá)紝涓嶄綔琛ㄨ堪銆?/span>
6. 涓€涓狟ug
鍦ㄨ繖嬈″皾璇曚腑錛屾祴璇曚竴涓嬩袱绔100-continue鐨勬敮鎸併€傚鏋滆姹備腑浣跨敤浜嗗ご閮?Expect: 100-continue"錛岄偅涔堟甯稿湴璇ヨ姹傝鏈変綋閮ㄣ€備絾鐢變簬鍦ㄧ5鑺備腑浠嬬粛鐨勯棶棰橈紝姝ゆ椂涓嶈兘鍐嶄嬌鐢╤2c錛岃€屽彧鑳戒嬌鐢╤2銆傚彟澶栵紝榪欐涓嶈闂潤鎬佹枃浠訛紝鑰屾槸璁塊棶Servlet(姝ゅ涓?test)銆傚畬鏁村懡浠ゅ涓嬶細(xì)
$ curl -vk --http2 -H "Expect: 100-continue" -d "body" https://localhost:8443/test
鍦ㄨ緭鍑虹殑鏈€鍚庡嚭鐜頒簡濡備笅淇℃伅錛?/span>
curl: (92) HTTP/2 stream 1 was not closed cleanly: CANCEL (err 8)
榪欏叾瀹炴槸Jetty鐨勪竴涓?a >Bug錛屾鍦ㄥ紑鍙戜腑鐨?.3.12宸茬粡淇浜嗗畠銆?/span>
7. 灝忕粨
HTTP/2渚濈劧綆楁槸鏂版疆鐨勬妧鏈紝瀵瑰悇瀹剁殑瀹炵幇錛屾棤璁烘槸鏈嶅姟鍣ㄧ錛屽鎴風(fēng)錛岃繕鏄垎鏋愬伐鍏鳳紝閮借鎸佹湁涓€浠芥€€鐤戞€佸害銆傝繖浜涘疄鐜板拰宸ュ叿閮芥槸紼嬪簭錛岄兘鏈夊彲鑳藉瓨鍦╞ug銆傝€屼笖鍗忚瀵硅澶氱粏鑺傛病鏈変綔鍑鴻瀹氾紝鍚勫閮戒細(xì)鍙戞尌鑷繁鐨勬兂鍍忓姏銆傛瘮濡傦紝Apache httpd鍜孞etty鍦ㄥ疄鐜版湇鍔″櫒绔帹閫佹椂錛屽叾鏂瑰紡灝變笉灝界浉鍚屻€?br /> 鍦ㄥ紑鍙戣嚜宸辯殑HTTP/2瀹炵幇鎴栧簲鐢ㄧ殑鏃跺€欙紝闇€瑕佸悓鏃朵嬌鐢ㄥ凡鏈夌殑涓嶅悓鏈嶅姟鍣ㄧ鍜屽鎴風(fēng)鍘婚儴緗插濂楁祴璇曠幆澧冭繘琛屽姣斿垎鏋愩€?br />