2017-06-09 100 views
-1

我有一個寫在Websocket,Polymer,ES6,HTML5中的SPA應用程序。這是由一個Jetty 9後端服務的,它被打包成一個可運行的jar包,並且在JAR中包含了所有的東西。我應該如何處理緩存?

我想要這樣,當部署新版本的JAR時,我會向客戶端推送一條消息,強制它對所有資源執行無緩存刷新。

我有一個自定義HttpServlet爲我的SPA,所以我可以處理URL「重寫」:

private static final Path ROOT = getDevelopmentWebRoot(); 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String requestPath = req.getPathInfo(); 

    if (requestPath.equals("/")) { 
     requestPath = "index.html"; 
    } else { 
     requestPath = requestPath.substring(1); 
    } 

    Path resource = ROOT.resolve(requestPath); 

    resp.setHeader("Cache-Control", "max-age=31536000"); 
    resp.setContentType(MimeTypes.getDefaultMimeByExtension(resource.toString())); 

    try { 
     Files.copy(resource, resp.getOutputStream()); 
    } catch (NoSuchFileException e) { 
     Files.copy(ROOT.resolve("index.html"), resp.getOutputStream()); 
    } 
} 

我想我的問題是,我怎麼能強制緩存刷新少在JavaScript?

回答

0

您可以使用「must-revalidate」設置標題爲「Last-Modified」和「Cache-Control」的緩存。這應該強制瀏覽器每次執行「If-Modified-Since」請求。

然後在你的前端,你可以每隔X秒重新加載一次頁面,如果沒有被修改,你應該從緩存中獲取(即時),否則它會加載新頁面。

我還沒有測試過,但我認爲它應該像你想要的那樣工作。

+0

謝謝 - 這就是我現在所做的。這並不理想,因爲每次頁面加載時仍然有一個請求發送到服務器,但它現在會做:) – Cheetah