B/S架構(gòu)
- 統(tǒng)一的瀏覽器(Browser):方便,屏蔽了不同服務(wù)商提供服務(wù)的差異性
- 服務(wù)端(Server)統(tǒng)一的HTTP協(xié)議,簡(jiǎn)化服務(wù)開(kāi)發(fā)者和服務(wù)器提供商的開(kāi)發(fā)
HTTP協(xié)議
無(wú)狀態(tài)的短連接的通信方式,一次請(qǐng)求就完成了數(shù)據(jù)交互,然后這次連接就斷開(kāi)了。這種方式是為了能夠同時(shí)服務(wù)更多的用戶。
B/S的基本原則
- 互聯(lián)網(wǎng)上所有的資源都要一個(gè)URL(統(tǒng)一資源定位符)表示
- 必須遵循HTTP協(xié)議
- 數(shù)據(jù)展示必須在瀏覽器中進(jìn)行
如何發(fā)起一個(gè)HTTP請(qǐng)求
- 發(fā)起一個(gè)HTTP請(qǐng)求的過(guò)程就是建立一個(gè)Socket通信的過(guò)程(什么是Socket通信?)
- httpclient 開(kāi)源的通過(guò)程序?qū)崿F(xiàn)的處理HTTP請(qǐng)求的工具包
-
LInux的curl指令 curl+url即可發(fā)起一個(gè)簡(jiǎn)單的HTTP請(qǐng)求
HTTP請(qǐng)求返回的HTML數(shù)據(jù)
HTTP解析
最重要的就是HTTP Header(控制用戶的數(shù)據(jù)傳輸,關(guān)鍵的是控制著用戶瀏覽器的渲染行為和服務(wù)器的執(zhí)行邏輯)
常見(jiàn)的HTTP請(qǐng)求頭,響應(yīng)頭,狀態(tài)碼見(jiàn)本文:HTTP協(xié)議
瀏覽器緩存機(jī)制
如果我們?yōu)g覽一個(gè)頁(yè)面發(fā)現(xiàn)有異常情況,通常會(huì)考慮是緩存問(wèn)題,一般做法是Ctrl+F5(mac 下是command+shift+R)刷新頁(yè)面(為什么不是F5(mac 下是command+R)),就一定可以拿到最新的頁(yè)面。(F5和Ctrl+F5區(qū)別?)
- 使用Ctrl+F5,瀏覽器會(huì)直接向目標(biāo)URL發(fā)送請(qǐng)求,而不會(huì)使用瀏覽器緩存的數(shù)據(jù)
- 使用Ctrl+F5,在HTTP請(qǐng)求中會(huì)增加一些請(qǐng)求頭,它告訴服務(wù)端我們要獲取的是最新數(shù)據(jù)而不是緩存。
即增加的兩個(gè)請(qǐng)求頭是:Pragma:no-cache, Cache-Control:no-cache。那么這兩個(gè)請(qǐng)求頭有什么作用呢?
Cache-Control/Pragma
這個(gè)HTTP Head字段用于指定所有緩存機(jī)制在整個(gè)請(qǐng)求/響應(yīng)鏈中必須服從的命令,如果知道該頁(yè)面是否為緩存,不僅可以控制瀏覽器,還可以控制和HTTP相關(guān)的緩存或代理服務(wù)器。該HTTP Head字段一些可選值如下:

Cache-Control請(qǐng)求字段被各個(gè)瀏覽器支持的很好,而且它的優(yōu)先級(jí)也比較高,它和其他請(qǐng)求字段(Expires)同時(shí)出現(xiàn)時(shí),Cache-Control會(huì)覆蓋其他字段。
Pragma字段的作用和Cache-Control有點(diǎn)類似,它也是在HTTP頭中包含一個(gè)特殊的指令,使得相關(guān)的服務(wù)器遵守該指令。最常用的就是Pragma:no-cache, 它和Cache-Control:no-cache的作用一致。
Expires
Expires通常的使用格式是Expires:Sat,25 Feb 2018 12:22:12 GMT,后面跟著一個(gè)日期和時(shí)間。超過(guò)這個(gè)時(shí)間值之后,緩存的內(nèi)容就會(huì)失效。即瀏覽器發(fā)送請(qǐng)求之前會(huì)檢查這個(gè)頁(yè)面的這個(gè)字段,看該頁(yè)面是否過(guò)期,過(guò)期了就重新向服務(wù)器發(fā)起請(qǐng)求。
Last-Modified/Etag
Last-Modified這個(gè)字段一般用于表示一個(gè)服務(wù)器上的資源的最后修改時(shí)間。資源可以是靜態(tài)的(靜態(tài)的自動(dòng)加上Last-Modified字段)也可以是動(dòng)態(tài)的(如Servlet提供一個(gè)getLastModified方法用于檢查某個(gè)動(dòng)態(tài)內(nèi)容是否已經(jīng)更新),通過(guò)這個(gè)最后修改時(shí)間可以判定當(dāng)前請(qǐng)求的資源是否是最新的。
一般服務(wù)端在響應(yīng)頭中返回一個(gè)Last-Modified字段,告訴瀏覽器這個(gè)頁(yè)面的最后修改時(shí)間,如Last-Modified: Sat, 25 Feb 2012 12:55:04 GMT,瀏覽器再次請(qǐng)求時(shí)在請(qǐng)求頭中增加一個(gè) If-Modified-Since:Sat, 25 Feb 2012 12:55:04 GMT字段,詢問(wèn)當(dāng)前緩存的頁(yè)面是否是最新的,如果是最新的就返回304狀態(tài)碼,告訴瀏覽器是最新的,服務(wù)器也不會(huì)傳輸新的數(shù)據(jù)。
與Last-Modified字段有類似功能的還有一個(gè)Etag字段,這個(gè)字段的作用是讓服務(wù)端給每個(gè)頁(yè)面分配一個(gè)唯一的編號(hào),然后通過(guò)這個(gè)編號(hào)來(lái)區(qū)分當(dāng)前這個(gè)頁(yè)面是否是最新的。這種方式比使用Last- Modified更加靈活,但是在后端的Web服務(wù)器有多臺(tái)時(shí)比較難處理,因?yàn)槊總€(gè)Web服務(wù)器都要記住網(wǎng)站的所有資源,否則瀏覽器返回這個(gè)編號(hào)就沒(méi)有意義了。
才疏學(xué)淺之處,切莫在意。
??????????????????????????????——2019.7.15下午
