W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
對(duì)ETag的支持是由Servlet的過濾器ShallowEtagHeaderFilter
提供的。它是純Servlet技術(shù)實(shí)現(xiàn)的過濾器,因此,它可以與任何web框架無縫集成。ShallowEtagHeaderFilter
過濾器會(huì)創(chuàng)建一個(gè)我們稱為弱ETag(與強(qiáng)ETag相對(duì),后面會(huì)詳述)的對(duì)象。過濾器會(huì)將渲染的JSP頁面的內(nèi)容(包括其他類型的內(nèi)容)緩存起來,然后以此生成一個(gè)MD5哈希值,并把這個(gè)值作為ETag頭的值寫回響應(yīng)中。下一次客戶端再次請(qǐng)求這個(gè)同樣的資源時(shí),它會(huì)將這個(gè)ETag的值寫到If-None-Match
頭中。過濾器會(huì)檢測(cè)到這個(gè)請(qǐng)求頭,然后再次把視圖渲染出來并比較兩個(gè)哈希值。如果比較的結(jié)果是相同的,那么服務(wù)器會(huì)返回一個(gè)304
。正如你所見,視圖仍然會(huì)被渲染,因此本質(zhì)上這個(gè)過濾器并非節(jié)省任何計(jì)算資源。唯一節(jié)省的東西,是帶寬,因?yàn)楸讳秩镜捻憫?yīng)不會(huì)被整個(gè)發(fā)送回客戶端。
請(qǐng)注意,這個(gè)策略節(jié)省的是網(wǎng)絡(luò)帶寬,而非CPU。因?yàn)閷?duì)于每個(gè)請(qǐng)求,完整的響應(yīng)仍然需要被整個(gè)計(jì)算出來。而其他在控制器層級(jí)實(shí)現(xiàn)的策略(上幾節(jié)所述的)可以同時(shí)節(jié)省網(wǎng)絡(luò)帶寬及避免多余計(jì)算。
你可以在web.xml
中配置ShallowEtagHeaderFilter
:
<filter>
<filter-name>etagFilter</filter-name>
<filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>etagFilter</filter-name>
<servlet-name>petclinic</servlet-name>
</filter-mapping>
如果是在Servlet 3.0以上的環(huán)境下,可以這么做:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new ShallowEtagHeaderFilter() };
}
}
更多配置細(xì)節(jié),請(qǐng)參考第Spring MVC 基于代碼的Servlet容器初始化一小節(jié)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: