HTTP協(xié)議
對瀏覽器客戶端 和 服務(wù)器端 之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范碟渺。
基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)
無狀態(tài), 但是可用cookie技術(shù)在請求和響應(yīng)報文中寫入cookie信息來控制客戶端的狀態(tài)。
連接步驟:
域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請求 --> 服務(wù)器返回http響應(yīng)突诬,瀏覽器得到html代碼 --> 瀏覽器解析html代碼苫拍,并請求html代碼中的資源(如js、css旺隙、圖片等) --> 瀏覽器對頁面進(jìn)行渲染呈現(xiàn)給用戶
Reqeust
GET /WebRoot/hello HTTP/1.1 -- 請求行
Host: localhost:8080 -- 請求頭(多個key-value對象)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
-- 一個空行
username=123&password=123456 --(post)請求正文/實體內(nèi)容
請求行
GET /WebRoot/hello HTTP/1.1
#http協(xié)議版本
http1.0:當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后怯疤,只能發(fā)送一次請求,一次請求之后連接關(guān)閉催束。
http1.1:默認(rèn)使用長連接集峦,當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后,可以在一次連接中發(fā)送多次請求抠刺。(基本都使用1.1)
#請求資源
URL: 統(tǒng)一資源定位符塔淤。http://localhost:8080/WebRoot/hello。只能定位互聯(lián)網(wǎng)資源速妖。是URI 的子集高蜂。URL=協(xié)議+主機端口+URI
URI: 統(tǒng)一資源標(biāo)記符。/WebRoot/hello罕容。用于標(biāo)記任何資源备恤「迨危可以是本地文件系統(tǒng)、局域網(wǎng)的資源露泊、 可以是互聯(lián)網(wǎng)資源喉镰。
#請求方式
常見的請求方式: GET 、 POST惭笑、 HEAD侣姆、 TRACE、 PUT沉噩、 CONNECT 捺宗、DELETE
常用的請求方式: GET 和 POST
GET(獲取資源)
- GET方法用來查詢,不會對瀏覽器上的信息產(chǎn)生影響
- 參數(shù)數(shù)據(jù)跟在地址欄(URI)后川蒙。以蚜厉?開頭、多個參數(shù)之間以&分割:GET /WebRoot/testMethod.html?name=123&password=123456 HTTP/1.1
- GET提交參數(shù)數(shù)據(jù)有限制畜眨,不超過1KB弯囊。(實際上URL不存在參數(shù)上限的問題,HTTP協(xié)議規(guī)范沒有對URL長度進(jìn)行限制胶果。這個限制是特定的瀏覽器及服務(wù)器對它的限制,IE對URL長度的限制是2083字節(jié))
- GET方式采用的是明文傳輸斤斧,不適合提交敏感密碼早抠。
- 注意: 瀏覽器直接訪問的請求,默認(rèn)提交方式是GET方式撬讽∪锪火狐瀏覽器以Get方式提交帶參數(shù)的數(shù)據(jù),會重復(fù)提交兩次
POST(傳輸實體主體)
- 參數(shù)跟在請求的實體內(nèi)容中游昼。沒有甘苍?開頭、多個參數(shù)之間以&分割
- POST提交的參數(shù)數(shù)據(jù)沒有限制烘豌。
- POST方式放在報文內(nèi)部無法看到载庭,適合提交敏感數(shù)據(jù)。
請求頭
鍵值對廊佩,例:常見的請求頭
Accept: text/html,image/* -- 瀏覽器接受的內(nèi)容類型
Accept-Charset: ISO-8859-1 -- 瀏覽器接受的編碼格式
Accept-Encoding: gzip,compress --瀏覽器接受的數(shù)據(jù)壓縮格式
Accept-Language: en-us,zh- --瀏覽器接受的語言
Host: www.it315.org:80 --(必輸)當(dāng)前請求域名(主機:端口)
Content-Type: application/x-www-form-urlencoded --提交的數(shù)據(jù)類型
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --瀏覽器最后的緩存時間
Referer: http://www.it315.org/index.jsp -- 當(dāng)前請求來自于哪里(可用來判斷非法鏈接)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --瀏覽器版本類型
Cookie:name=123 -- 瀏覽器保存的cookie信息
Connection: close/Keep-Alive -- 瀏覽器跟服務(wù)器連接狀態(tài)囚聚。close:連接關(guān)閉 keep-alive:保持連接
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 請求發(fā)出的時間
Content-Type 常見的媒體格式類型如下:
? text/html: HTML格式
? text/plain :純文本格式
? text/xml : XML格式
? text/x-markdown:markdown格式
? image/gif :gif圖片格式
? image/jpeg :jpg圖片格式
? image/png:png圖片格式application/xhtml+xml :XHTML格式
application/xml : XML數(shù)據(jù)格式
application/atom+xml :Atom XML聚合格式
application/json : JSON數(shù)據(jù)格式
application/pdf :pdf格式
application/msword : Word文檔格式
application/octet-stream : 二進(jìn)制流數(shù)據(jù)(如常見的文件下載)
application/x-www-form-urlencoded :<form encType="">
中默認(rèn)的encType(表單默認(rèn)的提交數(shù)據(jù)的格式)form表單數(shù)據(jù)被編碼以鍵值對形式?key1=value1&key2=value2的方式發(fā)送到服務(wù)器
空行
請求正文/實體內(nèi)容
請求頭和請求正文之間是一個空行标锄,它表示請求頭已經(jīng)結(jié)束顽铸,接下來的是請求正文。
只有POST提交的參數(shù)會放到實體內(nèi)容中,如username=123&password=123456
HttpServletRequest
tomcat服務(wù)器把請求信息封裝到HttpServletRequest對象料皇,把響應(yīng)信息封裝到HttpServletResponse對象谓松。然后調(diào)用servlet的方法星压,傳入request和response對象
HttpServletRequest對象用于獲取請求數(shù)據(jù),核心的API:
請求行:
request.getMethod(); 獲取請求方式
request.getRequetURI(); / request.getRequetURL(); 獲取請求資源
request.getProtocol(); 獲取請求http協(xié)議版本
request.getQueryString(); (獲取GET方式傳遞的參數(shù))
請求頭:
request.getHeaderNames(); 獲取所有的請求頭名稱
request.getHeader("名稱"); 根據(jù)請求頭獲取請求值
實體內(nèi)容:
request.getInputStream(); 獲取實體內(nèi)容數(shù)據(jù)(獲取POST方式傳遞的參數(shù))
GET鬼譬、POST請求參數(shù) 統(tǒng)一通用方便的獲取方法:
request.getParameterNames(); 獲取所有參數(shù)名稱列表(參數(shù)名為 html表單中數(shù)據(jù)標(biāo)簽的name屬性值)
request.getParameter("參數(shù)名"); 根據(jù)參數(shù)名獲取參數(shù)值(只能獲取一個值的參數(shù))
request.getParameterValue("參數(shù)名“); 根據(jù)參數(shù)名獲取參數(shù)值(可以獲取多個值的參數(shù))
編碼問題:
修改GET方式參數(shù)編碼:
手動解碼:String name = new String(request.getParameter("參數(shù)名").getBytes("iso-8859-1"),"utf-8");
修改POST方式參數(shù)編碼:
設(shè)置參數(shù)查詢碼表:request.setCharacterEncoding("utf-8"); 放在查詢參數(shù)之前娜膘,只對實體內(nèi)容起作用
改服務(wù)器配置文件:找到并在%tomcat%/conf/server.xml文件Connector標(biāo)簽中加入 URIEncoding="utf-8"
請求案例:獲取瀏覽器的類型(user-agent), 防止非法鏈接(referer)
Response
HTTP/1.1 200 OK --響應(yīng)行
Server: Apache-Coyote/1.1 --響應(yīng)頭(key-vaule)
Content-Length: 24
Date: Fri, 30 Jan 2015 01:54:57 GMT
--一個空行
this is hello servlet!!! --響應(yīng)正文/實體內(nèi)容
響應(yīng)行
HTTP/1.1 200 OK
#狀態(tài)碼: 服務(wù)器處理請求的結(jié)果(狀態(tài))
常見的狀態(tài):
200: 表示請求處理完成并完美返回
302: 表示請求需要進(jìn)一步細(xì)化拧簸。
404: 表示客戶訪問的資源找不到劲绪。
500: 表示服務(wù)器的資源發(fā)送錯誤。(服務(wù)器內(nèi)部錯誤)
#狀態(tài)描述
響應(yīng)頭
鍵值對盆赤,例:常見的響應(yīng)頭
Location: 重定向地址 --表示重定向的地址贾富,該頭和302的狀態(tài)碼一起使用。
Server:apache tomcat --表示服務(wù)器的軟件信息, 它和請求報頭域User-Agent是相對應(yīng)的
Content-Encoding: gzip --表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)壓縮類型
Content-Length: 80 --表示服務(wù)器發(fā)送給瀏覽器的實體正文長度
Content-Language: zh-cn --表示服務(wù)器支持的語言
Content-Type: text/html; charset=GB2312 --表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)類型及內(nèi)容編碼
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --表示服務(wù)器資源的最后修改時間
Refresh: 秒數(shù);url=地址 --表示定時刷新到指定頁面
Content-Disposition: attachment; filename=aaa.zip --表示告訴瀏覽器以下載方式打開資源(下載文件時用到)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search --表示服務(wù)器發(fā)送給瀏覽器的cookie信息(會話管理用到)
Expires: -1 --響應(yīng)過期時間牺六,-1表示通知瀏覽器不進(jìn)行緩存
Cache-Control: no-cache --同上
Pragma: no-cache --同上
Connection: close/Keep-Alive --表示服務(wù)器和瀏覽器的連接狀態(tài)颤枪。close:關(guān)閉連接 keep-alive:保存連接
響應(yīng)行
響應(yīng)正文/實體內(nèi)容
響應(yīng)正文就是服務(wù)器返回給瀏覽器的資源的內(nèi)容:html, css, js,甚至圖片
由響應(yīng)頭的Content-···等屬性告知瀏覽器 響應(yīng)正文的長度、編碼淑际、媒體類型等(MIME Type是經(jīng)過 ietf 組織協(xié)商畏纲,以 RFC 的形式作為建議標(biāo)準(zhǔn)發(fā)布在網(wǎng)上的)
由response對象PrintWriter寫入數(shù)據(jù)內(nèi)容
HttpServletResponse
tomcat服務(wù)器把請求信息封裝到HttpServletRequest對象,把響應(yīng)信息封裝到HttpServletResponse對象春缕。然后調(diào)用servlet的方法盗胀,傳入request和response對象
HttpServletResponse對象用于修改響應(yīng)信息,核心的API:
響應(yīng)行:
response.setStatus(); 設(shè)置狀態(tài)碼
響應(yīng)頭:
response.setHeader("name","value"); 設(shè)置響應(yīng)頭
response.sendRedirect(url); 重定向
response.setContentType("text/html;charset=utf-8"); 發(fā)送給瀏覽器的數(shù)據(jù)類型 及內(nèi)容編碼
實體內(nèi)容:(瀏覽器直接能夠看到)
response.getWriter().writer(); 發(fā)送字符實體內(nèi)容
response.getOutputStream().writer() 發(fā)送字節(jié)實體內(nèi)容
tomcat服務(wù)器把response對象的內(nèi)容轉(zhuǎn)換成響應(yīng)格式內(nèi)容锄贼,再發(fā)送給瀏覽器解析票灰。
編碼問題:
response.setCharacterEncoding("utf-8"); 放在響應(yīng)實體內(nèi)容代碼之前,對getOutputStream().writer()字節(jié)流不起作用
響應(yīng)案例:請求重定向(Location)宅荤,定時刷新(refresh)屑迂,content-Type數(shù)據(jù)類型(在tomcat服務(wù)器web.xml中用mime-type標(biāo)簽規(guī)定了數(shù)據(jù)類型,例如:text/html發(fā)送HTML文本冯键;image/jpg發(fā)送圖片)
HTTPS協(xié)議 是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸惹盼、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全