2017-06-09 2 views
-1

Ich habe eine SPA-Anwendung, die in Websocket, Polymer, ES6, HTML5 geschrieben ist. Dies wird durch ein Jetty 9 Backend bedient, das als lauffähiges Glas mit absolut allem im JAR verpackt ist.Wie sollte ich mit Caching umgehen?

Ich möchte es so haben, dass, wenn eine neue Version der JAR bereitgestellt wird, ich eine Nachricht an den Client herunter, um eine cache-less Aktualisierung aller Ressourcen zu erzwingen.

Ich habe eine benutzerdefinierte HttpServlet mein SPA zu dienen, damit ich die URL umgehen kann „Umschreiben“:

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()); 
    } 
} 

Ich denke, meine Frage ist, wie kann ich einen Cache-Refresh weniger in Javascript erzwingen?

Antwort

0

Sie können einen Cache mit den Headern "Last-Modified" und "Cache-Control" mit "must-revalidate" einrichten. Dies sollte den Browser zwingen, immer eine "If-Modified-Since" Anfrage zu machen.

Dann in Ihrem Frontend können Sie die Seite nur alle X Sekunden neu laden, und wenn nichts wie geändert wurde, sollten Sie es aus dem Cache (sofort) erhalten, sonst wird es die neue Seite laden.

Ich habe es nicht getestet, aber ich denke, es sollte funktionieren, wie Sie es wollen.

+0

Danke - dafür habe ich mich entschieden - vorerst. Es ist nicht ideal, da es immer noch eine Anfrage gibt, die bei jedem Seitenladen auf den Server geht, aber es wird vorerst funktionieren :) – Cheetah

Verwandte Themen