簡體   English   中英

停止使用Java緩存文件

[英]Stop caching files with Java

我試圖避免緩存我的自定義js文件,因為我經常更改它們,並且客戶端會緩存舊的js文件。

因此,我正在嘗試一種解決方案( http://www.baeldung.com/cachable-static-assets-with-spring-mvc ),但是它沒有用。 它根本不會像預期的那樣更改js文件的名稱。

我正在使用Spring MVC 5

WebMvcConfigurer

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler()
                .setCacheControl(CacheControl.maxAge(1, TimeUnit.SECONDS))
                .resourceChain(false)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
}

HTML

<script type="text/javascript" src="<c:url value="../resources/js/pageJS/login.js" />"></script>

web.xml中

<filter>
    <filter-name>resourceUrlEncodingFilter</filter-name>
    <filter-class>
        org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>resourceUrlEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

知道發生了什么嗎?

../resources/js/pageJS/login.js 保持相同的名稱

似乎您需要使用

registry.addResourceHandler("/js/**")
            .addResourceLocations("/js/")

代替

registry.addResourceHandler()

取決於login.js文件的位置

另外,將1秒更改為30秒,以便給Spring提供一些呼吸空間:)

在您的控制器類的請求映射方法中嘗試以下操作:

@RequestMapping("/test")
public ModelAndView preventCache(HttpServletResponse response){
    response.setHeader("Expires", "Tue, 01 Jan 2001 00:00:01 GMT");
    response.setHeader("Last-Modified", new Date().toString());
    response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
    response.setHeader("Pragma", "no-cache");
    return new ModelAndView("viewName");
}

添加過期或緩存控制標頭

標簽:服務器

該規則有兩個方面:

  • 對於靜態組件:通過設置遠期Expires標頭來實現“永不過期”策略
  • 對於動態組件:使用適當的Cache-Control標頭來幫助瀏覽器進行條件請求

網頁設計越來越豐富,這意味着頁面中會有更多的腳本,樣式表,圖像和Flash。 首次訪問頁面的訪問者可能必須發出多個HTTP請求,但是通過使用Expires標頭,您可以使這些組件可緩存。 這避免了后續頁面視圖上不必要的HTTP請求。 Expires標頭最常與圖像一起使用,但應在所有組件(包括腳本,樣式表和Flash組件)上使用它們。

瀏覽器(和代理)使用緩存來減少HTTP請求的數量和大小,從而使網頁加載速度更快。 Web服務器使用HTTP響應中的Expires標頭告訴客戶端可以將組件緩存多長時間。 這是一個遠期的Expires標頭,告訴瀏覽器直到2010年4月15日,此響應才會陳舊。

  Expires: Thu, 15 Apr 2010 20:00:00 GMT

如果您的服務器是Apache,請使用ExpiresDefault指令設置相對於當前日期的到期日期。 ExpiresDefault指令的此示例將Expires日期設置為從請求時間算起的10年。

  ExpiresDefault "access plus 10 years"

請記住,如果使用遠期的Expires標頭,則每當組件更改時,都必須更改組件的文件名。 在雅虎! 我們通常將此步驟作為構建過程的一部分:版本號嵌入在組件的文件名中,例如yahoo_2.0.6.js。

僅在用戶已經訪問您的網站之后,使用將來有效的Expires標頭才會影響頁面瀏覽量。 當用戶首次訪問您的站點並且瀏覽器的緩存為空時,它對HTTP請求的數量沒有影響。 因此,此性能改進的影響取決於用戶使用預填充緩存訪問您的頁面的頻率。 (“主緩存”已包含頁面中的所有組件。)我們在Yahoo! 並發現帶有預填充緩存的頁面瀏覽量為75-85%。 通過使用遠期的Expires標頭,可以增加瀏覽器緩存並在后續頁面視圖中重復使用的組件的數量,而無需通過用戶的Internet連接發送單個字節。

利用瀏覽器緩存

當PageSpeed Insights檢測到來自服務器的響應不包括緩存頭或指定僅在短時間內緩存資源時,將觸發此規則。

概觀

通過網絡獲取資源既緩慢又昂貴:下載可能需要在客戶端和服務器之間進行多次往返,這會延遲處理並可能阻止頁面內容的呈現,並且還會增加訪問者的數據成本。 所有服務器響應都應指定一個緩存策略,以幫助客戶端確定是否以及何時可以重用以前獲取的響應。

建議

每個資源都應指定一個明確的緩存策略,以回答以下問題:該資源是否可以緩存,以及誰可以緩存該資源多長時間,如果適用,在緩存策略過期時如何對其進行有效地重新驗證。 服務器返回響應時,它必須提供Cache-Control和ETag標頭:

  • Cache-Control定義瀏覽器和其他中間緩存可以如何緩存單個響應,以及將其緩存多長時間。 要了解更多信息,請參閱使用Cache-Control進行緩存。
  • ETag提供了一個重新驗證令牌,該令牌由瀏覽器自動發送,以檢查自上次請求以來資源是否已更改。 要了解更多信息,請參閱使用ETag驗證緩存的響應。

要確定適合您站點的最佳緩存策略,請使用以下指南:

  • 定義最佳的緩存控制策略
  • 無效和更新緩存的響應
  • 緩存清單

對於靜態資產或不經常更改的資產,我們建議最短緩存時間為一周,最好為一年。 如果您需要精確控制何時使資源無效,我們建議您使用URL指紋或版本控制技術-請參閱上方的使無效和更新緩存的響應鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM