關於瀏覽器緩存,cookie , session


緩存分為2種:

1.  強緩存: 直接從本地緩存中取資源,不會和服務器通信,返回的http狀態碼是200(from cache);

2.  協商緩存:通過服務器來告知是否能用本地緩存。先和服務器通信,如果返回可以使用本地緩存的指示,再從本地緩存中取(服務器不會返回被請求資源,返回的狀態碼是403(Not Modified));如果不可以使用本地緩存就會返回最新的資源;

瀏覽器發起第二次相同的請求時會先判斷能不能使用強緩存,不行的話,再判斷能不能使用協商緩存(如果沒有設置強緩存,協商緩存也不會生效)。

一、強緩存

強緩存是由headers中的Expires和cache-control決定的,后者優先級高於前者。

Expries是http1.0提出的,表示失效時間(GMT格式),只有在這個時間之前的請求才可以用強緩存。

第一次向服務器請求一個資源后,瀏覽器不僅會把資源保存起來,也會保存Reponse Headers,包括其中的Expires。第二次發請求時先去緩存中尋找這個資源,取到Expires,與當前的請求時間做對比,如果在Expires之前,則從緩存中取,否則重新向服務器請求,Expires在重新加載時被更新。

cache-control可以有多個值:

cache-control: max-age=111000  -->表示自第一次收到響應后的111000ms以后可以用緩存

cache-control: no-cache   -->禁止使用強緩存

cache-control: no-store  -->禁止使用緩存,每次都要去服務器重新請求

cache-control: private  -->只允許被終端用戶的瀏覽器端緩存

cache-control: public -->可以被所有用戶緩存,保存終端用戶和CDN等代理服務器

由於Expries是個絕對時間,由於各個客戶端之間有時差就會導致緩存不一致的問題,所以http 1.1提出了cache-control,是個相對時間,在第二次發請求時取到緩存中的max-age和第一次的請求時間計算出資源過期時間,與當前的請求時間對比決定是否使用緩存

二、協商緩存 

有兩組headers值:Last-Modified / If-Modified-Since 和 Etag / If-None-Match,后者優先級高於前者。

第一次和第二次的同一個請求:

     

1. Last-Modified / If-Modified-Since

第一次請求時返回的Response Headers中用Last-Modified表示請求的資源在服務器上最新的修改時間,第二次請求時在Request Headers中用If-Modified-Since帶上這個值發到服務器,服務器對比這個值和這個資源市價上的最新修改時間決定是否直接返回403還是返回資源。當返回403時,表示資源沒有更新,所以瀏覽器緩存中的Last-Modified也就不用更新了。

但是Last-Modified的問題在於有時服務器上資源其實有變化,但是最后修改時間卻沒有變化,所以有了Etag / If-None-Match來管理協商緩存。

2. Etag / If-None-Match

Etag是服務器根據被請求資源生成的一個唯一標識字符串,只要資源發生變化,Etag就會變,跟資源的最新修改時間沒有關系,能彌補Last-Modified的不足。與Last-Modified類似,第二次請求時請求頭會帶上If-None-Match標識的Etag值,區別是由於服務器每次會根據資源重新生成一個Etag,再拿它跟瀏覽器傳過來的Etag對比,如果一致則返回403,所以由於每次Etag都會重新生成,所以瀏覽器緩存中的Etag也必須每次都更新。

一般Last-Modified和Etag是同時啟用的,但是對於分布式系統多同機器間文件的Last-Modified必須一致,以免因為負載均衡到不同機器導致比對不一致,分布式系統盡量關閉Etag,因為每台機器生成的Etag也不一致。

另外當使用F5刷新時會跳過強緩存,當強制刷新時,強緩存和協商緩存都會跳過。其他操作行為如前進后退,地址欄回車都會按正常流程走。

瀏覽器默認都會緩存圖片,js,css等靜態文件,也可以通過待會再響應頭中設置是否要啟用緩存,或是通過服務器專門的配置文件統一設置Expires, Cache-control等。

3. 發布更新時,為了避免緩存,采用a.css?v1.1 和 a_v1.1.css的區別( 覆蓋式發布 和 非覆蓋式發布)見https://www.zhihu.com/question/20790576

一、Cookie, Session

cookie和session都是為了彌補http協議的無狀態特性,對server端來說無法知道兩次http請求是否來自同一個用戶,利用cookie和session就可以讓用戶只登錄一次,server就知道某個請求是否需用重新登錄。

1. cookie:客戶端第一次正常訪問服務器,服務器在response headers中返回與用戶信息相關的cookie,客戶端收到后把cookie保存在本地,下次再發請求時會在request headers中帶上這個cookie,服務器收到這個cookie就知道用戶狀態了。cookie可以設置過期時間,默認值是-1,表示關閉瀏覽器時cookie就會失效,值為0時表示立馬失效,相當於刪除cookie(cookie沒有刪除的方法),服務器和客戶端都可以設置cookie,但不可以操作另一個域名下的cookie。

2. session: 客戶端第一次正常訪問服務器,服務器生成一個sessionid來標識用戶並保存用戶信息(服務器有一個專門的地方來保存所有用戶的sessionId),在response headers中作為cookie的一個值返回,客戶端收到后把cookie保存在本地,下次再發請求時會在request headers中帶上這個sessionId,服務器通過查找這個sessionId就知道用戶狀態了,並更新sessionId的最后訪問時間。sessionId也會可以設置失效時間,比如如果60分鍾內某個session都沒有被更新,服務器就會刪除這個它。

總言之cookie是保存在客戶端,session是存在服務器,session依賴於cookie。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM