2017-06-09 96 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