你應該知道的HTTP頭 ETag

2021-07-23 14:02:30 字數 4092 閱讀 8661

在http1.1規範中,新增了乙個http頭資訊:etag。對web開發者來說,它是乙個非常重要的資訊。它是用作快取使

用的兩個主要的

頭資訊之一 (另乙個是expires)。除此之外,在rest架構中,它還可以用於控制併發操作(上節中已經大

致介紹atompub中控

制併發的流

程)。那麼etag是什麼?它又幾種型別?強etag與弱etag之間有什麼區別。?

如何計算

etag值?它與last-modified頭

資訊在使用上有什

麼區別?

本節主要圍繞這幾個方面敘述一下自己的理解。

目錄:

什麼是etag?

計算etag值

etag的型別以及他們之間的區別

etag與last-modified頭資訊用途上的區別

什麼是etag?

etag:是實體標籤(entity tag)的縮寫。etag一般不以明文形式相應給客戶端。在資源的各個生命週期中,它都具有不

同的值,用

於標識出資源的狀態。當資源發生變更時,如果其頭資訊中乙個或者多個發生變化,或者訊息實體發生變化

,那麼etag也隨之發生變化。

etag值的變更說明資源狀態已經被修改。往往可以通過時間戳就可以便宜的得到etag頭資訊。在服

務端中如果發回給

消費者的相應

從一開始起就由etag控制,那麼可以確保更細粒度的etag公升級完全由服務來進行控制。服務

計算etag值,

並在相應客戶端請求時將

它返回給客戶端。

計算etag值

在http1.1協議中並沒有規範如何計算etag。etag值可以是唯一標識資源的任何東西,如持久化儲存中的某個資源關聯

的版本、乙個或

者多個檔案屬性,實體頭資訊和校

驗值、(checksum),也可以計算實體資訊的雜湊值。有時候,為了計

算乙個etag

值可能有比

較大的代價,此時可以採用生成

唯一值等方式(如

常見的guid)。無論怎樣,服務都應該盡可能的

將etag值返回給客

戶端。客戶端不

用關心etag值如何產生,只要服務在資源狀態發生變

更的情況下將etag值傳送給它就行

。下圖為msdn中,

outgoingresponse類

中設定etag值的截圖:

從上圖可以看出,在rest架構下,etag值可以通過guid、整數、長整形、字串四種型別的引數傳入setetag方法,

wcf服

務發回給

客戶端的http響應頭中就包含了etag值。另外outgoingresponse類也有字串屬性:etag直接給

它賦值也能在

http響應頭中寫入

etag值。

如下所示為使用檔案屬性計算etag:

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

publicclassetag : iheader

#region iheader 成員

獲取etag:

1

etag etag =newetag(fileinfo.name+fileinfo.lastwritetimeutc.tostring())

計算etag值時,需要考慮兩個問題:計算與儲存。如果乙個etag值只需要很小的代價以及占用很低的儲存空間,那麼

我們可以在每次

需要傳送給客戶端etag值值的時候計算一遍就行行了。相反的,我們需要將之前就已經計算並儲存好

的etag值

傳送給客戶端。之前

說:將時間戳作為字串作為一種廉價的方式來獲取etag值。對於不是經常變化的訊息,

它是一種足

夠好的方

案。注意:如果將時間戳

做為etag值,通常不應該用last-modified的值。由於http機制中,所

以當我們在通過

服務校驗資源

狀態時,客戶端不需要進行相應的

改動。計算etag值開銷最大的一般是計算採用雜湊演算法

獲取資源的表述值。

可以只計算資源

的雜湊值,也可以將頭資訊和頭資訊的值也

包含進去。如果包含頭資訊,那麼注意

不要包含計算機標識的

頭資訊。同樣也應該避

免包含expires、cache-control和vary頭資訊。注

意:在通過雜湊演算法

計算etag值時,先要組裝資

源的表述。若組裝也比較耗時

,可以採用生成guid的方式。優化etag值的獲取。

etag有兩種型別＀現將�etag(strong etag)與弱etag(weak etag)。

強etag表示形式:"22faa065-2664-4197-9c5e-c92ea03d0a16"。

弱etag表現形式:w/"22faa065-2664-4197-9c5e-c92ea03d0a16"。

強、弱etag型別的出現

與apache

伺服器計算etag的方式有關。apache預設通過fileetag中fileetag inode mtime siz

e的配置自動生成etag

(當然也可以通過使用者自

定義的方式)。假設服務端的資源頻繁被修改(如1秒內修改了n次),此時

如果有使用者將apache

的配置改為mtime,由於mtime只能精

確到秒,那麼就可以避免強etag在1秒內的etag總是不同而

頻繁重新整理cache

(如果資源在

秒級經常被修改,也可以通過last-modified

來解決)。

etag與last-modified頭資訊用途上的區別

按照http標準,last-modified只能精確到秒級。etag的出現可以很好的解決這個問題。在用途上,etag常與

if-none-match或者

if-match一起,由客戶端通過http頭資訊(包括etag值)傳送給服務端處理。etag使用如下:

或if-none-match:"22faa065-2664-4197-9c5e-c92ea03d0a16"

last-modified常與if-modified-since一起由客戶端將last-modified值包括在http頭資訊中發給服務端進行處理。

其使用如下:

if-modified-since:sat,24 dec 2011 11:55:36 gmt

你知道HTTP協議的ETag是幹什麼的嗎?

在http1.1規範中,新增了乙個http頭資訊 etag。對於普通開發者來說,可能平時真的不會接觸到該http頭。平時接觸不到或者說用得少,不代表這個請求頭不重要。etag使用得當,是可以減少伺服器頻寬壓力的。etag是 entity tag的縮寫,可以理解為 被請求變數的實體值 etag是服務端...

你知道HTTP協議的ETag是幹什麼的嗎?

在http1.1規範中,新增了乙個http頭資訊 etag。對於普通開發者來說,可能平時真的不會接觸到該http頭。平時接觸不到或者說用得少,不代表這個請求頭不重要。etag使用得當,是可以減少伺服器頻寬壓力的。etag是 entity tag的縮寫,可以理解為 被請求變數的實體值 etag是服務端...

你應該知道git rebase

多人開發時,一般都會使用git來進行 管理。使用過git的童鞋肯定對git pullgit pushgit merge非常熟悉。那麼,大家有沒有了解過git rebase命令呢?rebase翻譯成中文叫 變基 相比merge,rebase並沒有進行合併操作,該命令只是提取了當前分支的修改,將其複製在...