這篇開(kāi)篇的時(shí)候,要感謝一下我的老大,他看到我在寫(xiě)這個(gè)系列,給我提供了一個(gè)他以前做內(nèi)部培訓(xùn)時(shí),寫(xiě)得很贊的兩個(gè)ppt,被我拿來(lái)為我所用,(*^__^*) 嘻嘻……。另外感謝下網(wǎng)上提供各種資料的IT同仁們。
3. 深入了解篇
3.1 Cookie和Session
Cookie和Session都為了用來(lái)保存狀態(tài)信息,都是保存客戶端狀態(tài)的機(jī)制,它們都是為了解決HTTP無(wú)狀態(tài)的問(wèn)題而所做的努力。
Session可以用Cookie來(lái)實(shí)現(xiàn),也可以用URL回寫(xiě)的機(jī)制來(lái)實(shí)現(xiàn)。用Cookie來(lái)實(shí)現(xiàn)的Session可以認(rèn)為是對(duì)Cookie更高級(jí)的應(yīng)用。
3.1.1兩者比較
Cookie和Session有以下明顯的不同點(diǎn):
1)Cookie將狀態(tài)保存在客戶端,Session將狀態(tài)保存在服務(wù)器端;
2)Cookies是服務(wù)器在本地機(jī)器上存儲(chǔ)的小段文本并隨每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器。Cookie最早在RFC2109中實(shí)現(xiàn),后續(xù)RFC2965做了增強(qiáng)。網(wǎng)絡(luò)服務(wù)器用HTTP頭向客戶端發(fā)送cookies,在客戶終端,瀏覽器解析這些cookies并將它們保存為一個(gè)本地文件,它會(huì)自動(dòng)將同一服務(wù)器的任何請(qǐng)求縛上這些cookies。Session并沒(méi)有在HTTP的協(xié)議中定義;
3)Session是針對(duì)每一個(gè)用戶的,變量的值保存在服務(wù)器上,用一個(gè)sessionID來(lái)區(qū)分是哪個(gè)用戶session變量,這個(gè)值是通過(guò)用戶的瀏覽器在訪問(wèn)的時(shí)候返回給服務(wù)器,當(dāng)客戶禁用cookie時(shí),這個(gè)值也可能設(shè)置為由get來(lái)返回給服務(wù)器;
4)就安全性來(lái)說(shuō):當(dāng)你訪問(wèn)一個(gè)使用session 的站點(diǎn),同時(shí)在自己機(jī)子上建立一個(gè)cookie,建議在服務(wù)器端的SESSION機(jī)制更安全些.因?yàn)樗粫?huì)任意讀取客戶存儲(chǔ)的信息。
3.1.2 Session機(jī)制
Session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí) - 稱為 session id,如果已包含一個(gè)session id則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè) session檢索出來(lái)使用(如果檢索不到,可能會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含session id,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè) session id將被在本次響應(yīng)中返回給客戶端保存。
3.1.6 Session的實(shí)現(xiàn)方式
3.1.6.1 使用Cookie來(lái)實(shí)現(xiàn)
服務(wù)器給每個(gè)Session分配一個(gè)唯一的JSESSIONID,并通過(guò)Cookie發(fā)送給客戶端。
當(dāng)客戶端發(fā)起新的請(qǐng)求的時(shí)候,將在Cookie頭中攜帶這個(gè)JSESSIONID。這樣服務(wù)器能夠找到這個(gè)客戶端對(duì)應(yīng)的Session。
流程如下圖所示:

3.1.6.2 使用URL回顯來(lái)實(shí)現(xiàn)
URL回寫(xiě)是指服務(wù)器在發(fā)送給瀏覽器頁(yè)面的所有鏈接中都攜帶JSESSIONID的參數(shù),這樣客戶端點(diǎn)擊任何一個(gè)鏈接都會(huì)把JSESSIONID帶會(huì)服務(wù)器。
如果直接在瀏覽器輸入服務(wù)端資源的url來(lái)請(qǐng)求該資源,那么Session是匹配不到的。
Tomcat對(duì)Session的實(shí)現(xiàn),是一開(kāi)始同時(shí)使用Cookie和URL回寫(xiě)機(jī)制,如果發(fā)現(xiàn)客戶端支持Cookie,就繼續(xù)使用Cookie,停止使用URL回寫(xiě)。如果發(fā)現(xiàn)Cookie被禁用,就一直使用URL回寫(xiě)。jsp開(kāi)發(fā)處理到Session的時(shí)候,對(duì)頁(yè)面中的鏈接記得使用response.encodeURL() 。
3.1.3在J2EE項(xiàng)目中Session失效的幾種情況
1)Session超時(shí):Session在指定時(shí)間內(nèi)失效,例如30分鐘,若在30分鐘內(nèi)沒(méi)有操作,則Session會(huì)失效,例如在web.xml中進(jìn)行了如下設(shè)置:
<session-config>
<session-timeout>30</session-timeout> //單位:分鐘
</session-config>
2)使用session.invalidate()明確的去掉Session。
3.1.4與Cookie相關(guān)的HTTP擴(kuò)展頭
1)Cookie:客戶端將服務(wù)器設(shè)置的Cookie返回到服務(wù)器;
2)Set-Cookie:服務(wù)器向客戶端設(shè)置Cookie;
3)Cookie2 (RFC2965)):客戶端指示服務(wù)器支持Cookie的版本;
4)Set-Cookie2 (RFC2965):服務(wù)器向客戶端設(shè)置Cookie。
3.1.5Cookie的流程
服務(wù)器在響應(yīng)消息中用Set-Cookie頭將Cookie的內(nèi)容回送給客戶端,客戶端在新的請(qǐng)求中將相同的內(nèi)容攜帶在Cookie頭中發(fā)送給服務(wù)器。從而實(shí)現(xiàn)會(huì)話的保持。
流程如下圖所示:

3.2 緩存的實(shí)現(xiàn)原理
3.2.1什么是Web緩存
WEB緩存(cache)位于Web服務(wù)器和客戶端之間。
緩存會(huì)根據(jù)請(qǐng)求保存輸出內(nèi)容的副本,例如html頁(yè)面,圖片,文件,當(dāng)下一個(gè)請(qǐng)求來(lái)到的時(shí)候:如果是相同的URL,緩存直接使用副本響應(yīng)訪問(wèn)請(qǐng)求,而不是向源服務(wù)器再次發(fā)送請(qǐng)求。
HTTP協(xié)議定義了相關(guān)的消息頭來(lái)使WEB緩存盡可能好的工作。
3.2.2緩存的優(yōu)點(diǎn)
q 減少相應(yīng)延遲:因?yàn)檎?qǐng)求從緩存服務(wù)器(離客戶端更近)而不是源服務(wù)器被相應(yīng),這個(gè)過(guò)程耗時(shí)更少,讓web服務(wù)器看上去相應(yīng)更快。
q 減少網(wǎng)絡(luò)帶寬消耗:當(dāng)副本被重用時(shí)會(huì)減低客戶端的帶寬消耗;客戶可以節(jié)省帶寬費(fèi)用,控制帶寬的需求的增長(zhǎng)并更易于管理。
3.2.3與緩存相關(guān)的HTTP擴(kuò)展消息頭
q Expires:指示響應(yīng)內(nèi)容過(guò)期的時(shí)間,格林威治時(shí)間GMT
q Cache-Control:更細(xì)致的控制緩存的內(nèi)容
q Last-Modified:響應(yīng)中資源最后一次修改的時(shí)間
q ETag:響應(yīng)中資源的校驗(yàn)值,在服務(wù)器上某個(gè)時(shí)段是唯一標(biāo)識(shí)的。
q Date:服務(wù)器的時(shí)間
q If-Modified-Since:客戶端存取的該資源最后一次修改的時(shí)間,同Last-Modified。
q If-None-Match:客戶端存取的該資源的檢驗(yàn)值,同ETag。
3.2.4客戶端緩存生效的常見(jiàn)流程
服務(wù)器收到請(qǐng)求時(shí),會(huì)在200OK中回送該資源的Last-Modified和ETag頭,客戶端將該資源保存在cache中,并記錄這兩個(gè)屬性。當(dāng)客戶端需要發(fā)送相同的請(qǐng)求時(shí),會(huì)在請(qǐng)求中攜帶If-Modified-Since和If-None-Match兩個(gè)頭。兩個(gè)頭的值分別是響應(yīng)中Last-Modified和ETag頭的值。服務(wù)器通過(guò)這兩個(gè)頭判斷本地資源未發(fā)生變化,客戶端不需要重新下載,返回304響應(yīng)。常見(jiàn)流程如下圖所示:

3.2.5 Web緩存機(jī)制
HTTP/1.1中緩存的目的是為了在很多情況下減少發(fā)送請(qǐng)求,同時(shí)在許多情況下可以不需要發(fā)送完整響應(yīng)。前者減少了網(wǎng)絡(luò)回路的數(shù)量;HTTP利用一個(gè)“過(guò)期(expiration)”機(jī)制來(lái)為此目的。后者減少了網(wǎng)絡(luò)應(yīng)用的帶寬;HTTP用“驗(yàn)證(validation)”機(jī)制來(lái)為此目的。
HTTP定義了3種緩存機(jī)制:
1)Freshness:允許一個(gè)回應(yīng)消息可以在源服務(wù)器不被重新檢查,并且可以由服務(wù)器和客戶端來(lái)控制。例如,Expires回應(yīng)頭給了一個(gè)文檔不可用的時(shí)間。Cache-Control中的max-age標(biāo)識(shí)指明了緩存的最長(zhǎng)時(shí)間;
2)Validation:用來(lái)檢查以一個(gè)緩存的回應(yīng)是否仍然可用。例如,如果一個(gè)回應(yīng)有一個(gè)Last-Modified回應(yīng)頭,緩存能夠使用If-Modified-Since來(lái)判斷是否已改變,以便判斷根據(jù)情況發(fā)送請(qǐng)求;
3)Invalidation: 在另一個(gè)請(qǐng)求通過(guò)緩存的時(shí)候,常常有一個(gè)副作用。例如,如果一個(gè)URL關(guān)聯(lián)到一個(gè)緩存回應(yīng),但是其后跟著POST、PUT和DELETE的請(qǐng)求的話,緩存就會(huì)過(guò)期。
3.3 斷點(diǎn)續(xù)傳和多線程下載的實(shí)現(xiàn)原理
q HTTP協(xié)議的GET方法,支持只請(qǐng)求某個(gè)資源的某一部分;
q 206 Partial Content 部分內(nèi)容響應(yīng);
q Range 請(qǐng)求的資源范圍;
q Content-Range 響應(yīng)的資源范圍;
q 在連接斷開(kāi)重連時(shí),客戶端只請(qǐng)求該資源未下載的部分,而不是重新請(qǐng)求整個(gè)資源,來(lái)實(shí)現(xiàn)斷點(diǎn)續(xù)傳。
分塊請(qǐng)求資源實(shí)例:
Eg1:Range: bytes=306302- :請(qǐng)求這個(gè)資源從306302個(gè)字節(jié)到末尾的部分;
Eg2:Content-Range: bytes 306302-604047/604048:響應(yīng)中指示攜帶的是該資源的第306302-604047的字節(jié),該資源共604048個(gè)字節(jié);
客戶端通過(guò)并發(fā)的請(qǐng)求相同資源的不同片段,來(lái)實(shí)現(xiàn)對(duì)某個(gè)資源的并發(fā)分塊下載。從而達(dá)到快速下載的目的。目前流行的FlashGet和迅雷基本都是這個(gè)原理。
多線程下載的原理:
q 下載工具開(kāi)啟多個(gè)發(fā)出HTTP請(qǐng)求的線程;
q 每個(gè)http請(qǐng)求只請(qǐng)求資源文件的一部分:Content-Range: bytes 20000-40000/47000;
q 合并每個(gè)線程下載的文件。
3.4 https通信過(guò)程
3.4.1什么是https
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容請(qǐng)看SSL。
見(jiàn)下圖:

https所用的端口號(hào)是443。
3.4.2 https的實(shí)現(xiàn)原理
有兩種基本的加解密算法類型:
1)對(duì)稱加密:密鑰只有一個(gè),加密解密為同一個(gè)密碼,且加解密速度快,典型的對(duì)稱加密算法有DES、AES等;
2)非對(duì)稱加密:密鑰成對(duì)出現(xiàn)(且根據(jù)公鑰無(wú)法推知私鑰,根據(jù)私鑰也無(wú)法推知公鑰),加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對(duì)對(duì)稱加密速度較慢,典型的非對(duì)稱加密算法有RSA、DSA等。
下面看一下https的通信過(guò)程:

https通信的優(yōu)點(diǎn):
1)客戶端產(chǎn)生的密鑰只有客戶端和服務(wù)器端能得到;
2)加密的數(shù)據(jù)只有客戶端和服務(wù)器端才能得到明文;
3)客戶端到服務(wù)端的通信是安全的。
3.5 http代理
3.5.1 http代理服務(wù)器
代理服務(wù)器英文全稱是Proxy Server,其功能就是代理網(wǎng)絡(luò)用戶去取得網(wǎng)絡(luò)信息。形象的說(shuō):它是網(wǎng)絡(luò)信息的中轉(zhuǎn)站。
代理服務(wù)器是介于瀏覽器和Web服務(wù)器之間的一臺(tái)服務(wù)器,有了它之后,瀏覽器不是直接到Web服務(wù)器去取回網(wǎng)頁(yè)而是向代理服務(wù)器發(fā)出請(qǐng)求,Request信號(hào)會(huì)先送到代理服務(wù)器,由代理服務(wù)器來(lái)取回瀏覽器所需要的信息并傳送給你的瀏覽器。
而且,大部分代理服務(wù)器都具有緩沖的功能,就好象一個(gè)大的Cache,它有很大的存儲(chǔ)空間,它不斷將新取得數(shù)據(jù)儲(chǔ)存到它本機(jī)的存儲(chǔ)器上,如果瀏覽器所請(qǐng)求的數(shù)據(jù)在它本機(jī)的存儲(chǔ)器上已經(jīng)存在而且是最新的,那么它就不重新從Web服務(wù)器取數(shù)據(jù),而直接將存儲(chǔ)器上的數(shù)據(jù)傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。
更重要的是:Proxy Server(代理服務(wù)器)是Internet鏈路級(jí)網(wǎng)關(guān)所提供的一種重要的安全功能,它的工作主要在開(kāi)放系統(tǒng)互聯(lián)(OSI)模型的對(duì)話層。
3.5.2 http代理服務(wù)器的主要功能
主要功能如下:
1)突破自身IP訪問(wèn)限制,訪問(wèn)國(guó)外站點(diǎn)。如:教育網(wǎng)、169網(wǎng)等網(wǎng)絡(luò)用戶可以通過(guò)代理訪問(wèn)國(guó)外網(wǎng)站;
2)訪問(wèn)一些單位或團(tuán)體內(nèi)部資源,如某大學(xué)FTP(前提是該代理地址在該資源的允許訪問(wèn)范圍之內(nèi)),使用教育網(wǎng)內(nèi)地址段免費(fèi)代理服務(wù)器,就可以用于對(duì)教育 網(wǎng)開(kāi)放的各類FTP下載上傳,以及各類資料查詢共享等服務(wù);
3)突破中國(guó)電信的IP封鎖:中國(guó)電信用戶有很多網(wǎng)站是被限制訪問(wèn)的,這種限制是人為的,不同Serve對(duì)地址的封鎖是不同的。所以不能訪問(wèn)時(shí)可以換一個(gè)國(guó) 外的代理服務(wù)器試試;
4)提高訪問(wèn)速度:通常代理服務(wù)器都設(shè)置一個(gè)較大的硬盤(pán)緩沖區(qū),當(dāng)有外界的信息通過(guò)時(shí),同時(shí)也將其保存到緩沖區(qū)中,當(dāng)其他用戶再訪問(wèn)相同的信息時(shí), 則直接由緩沖區(qū)中取出信息,傳給用戶,以提高訪問(wèn)速度;
5)隱藏真實(shí)IP:上網(wǎng)者也可以通過(guò)這種方法隱藏自己的IP,免受攻擊。
3.5.3 http代理圖示
http代理的圖示見(jiàn)下圖:

對(duì)于客戶端瀏覽器而言,http代理服務(wù)器相當(dāng)于服務(wù)器。
而對(duì)于Web服務(wù)器而言,http代理服務(wù)器又擔(dān)當(dāng)了客戶端的角色。
3.6 虛擬主機(jī)的實(shí)現(xiàn)
3.6.1什么是虛擬主機(jī)
虛擬主機(jī):是在網(wǎng)絡(luò)服務(wù)器上劃分出一定的磁盤(pán)空間供用戶放置站點(diǎn)、應(yīng)用組件等,提供必要的站點(diǎn)功能與數(shù)據(jù)存放、傳輸功能。
所謂虛擬主機(jī),也叫“網(wǎng)站空間”就是把一臺(tái)運(yùn)行在互聯(lián)網(wǎng)上的服務(wù)器劃分成多個(gè)“虛擬”的服務(wù)器,每一個(gè)虛擬主機(jī)都具有獨(dú)立的域名和完整的Internet服務(wù)器(支持WWW、FTP、E-mail等)功能。一臺(tái)服務(wù)器上的不同虛擬主機(jī)是各自獨(dú)立的,并由用戶自行管理。但一臺(tái)服務(wù)器主機(jī)只能夠支持一定數(shù)量的虛擬主機(jī),當(dāng)超過(guò)這個(gè)數(shù)量時(shí),用戶將會(huì)感到性能急劇下降。
3.6.2虛擬主機(jī)的實(shí)現(xiàn)原理
虛擬主機(jī)是用同一個(gè)WEB服務(wù)器,為不同域名網(wǎng)站提供服務(wù)的技術(shù)。Apache、Tomcat等均可通過(guò)配置實(shí)現(xiàn)這個(gè)功能。
相關(guān)的HTTP消息頭:Host。
例如:Host: www.baidu.com
客戶端發(fā)送HTTP請(qǐng)求的時(shí)候,會(huì)攜帶Host頭,Host頭記錄的是客戶端輸入的域名。這樣服務(wù)器可以根據(jù)Host頭確認(rèn)客戶要訪問(wèn)的是哪一個(gè)域名。
附錄:參考資料
《理解Cookie和Session機(jī)制》:
http://sumongh.javaeye.com/blog/82498
《淺析HTTP協(xié)議》:
http://203.208.39.132/search?q=cache:CdXly_88gjIJ:www.cnblogs.com/gpcuster/archive/2009/05/25/1488749.html+http%E5%8D%8F%E8%AE%AE+web%E7%BC%93%E5%AD%98&cd=27&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy2-vzOcP8XTG1h7lcRr2GJrkTbH2Cg
《http代理_百度百科》:
http://baike.baidu.com/view/1159398.htm
《虛擬主機(jī)_百度百科》:
http://baike.baidu.com/view/7383.htm
《https_百度百科》:http://baike.baidu.com/view/14121.htm