Spring MVC 創(chuàng)建弱ETag對象

2018-07-26 15:45 更新

對ETag的支持是由Servlet的過濾器ShallowEtagHeaderFilter提供的。它是純Servlet技術(shù)實現(xiàn)的過濾器,因此,它可以與任何web框架無縫集成。ShallowEtagHeaderFilter過濾器會創(chuàng)建一個我們稱為弱ETag(與強ETag相對,后面會詳述)的對象。過濾器會將渲染的JSP頁面的內(nèi)容(包括其他類型的內(nèi)容)緩存起來,然后以此生成一個MD5哈希值,并把這個值作為ETag頭的值寫回響應(yīng)中。下一次客戶端再次請求這個同樣的資源時,它會將這個ETag的值寫到If-None-Match頭中。過濾器會檢測到這個請求頭,然后再次把視圖渲染出來并比較兩個哈希值。如果比較的結(jié)果是相同的,那么服務(wù)器會返回一個304。正如你所見,視圖仍然會被渲染,因此本質(zhì)上這個過濾器并非節(jié)省任何計算資源。唯一節(jié)省的東西,是帶寬,因為被渲染的響應(yīng)不會被整個發(fā)送回客戶端。

請注意,這個策略節(jié)省的是網(wǎng)絡(luò)帶寬,而非CPU。因為對于每個請求,完整的響應(yīng)仍然需要被整個計算出來。而其他在控制器層級實現(xiàn)的策略(上幾節(jié)所述的)可以同時節(jié)省網(wǎng)絡(luò)帶寬及避免多余計算。

你可以在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() };
    }

}

更多配置細節(jié),請參考第Spring MVC 基于代碼的Servlet容器初始化一小節(jié)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號