在jboss服务器中为Web应用程序进行新部署后,浏览器缓存文件未更新

cedebl8k  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(193)

我正在使用jboss服务器7.1.1来部署一个java web应用程序。对于js,css,字体文件,浏览器缓存没有随着新的更改而更新。每次我们都坚持让客户端清除浏览器中的缓存,以使新的更改生效。
有没有我可以配置的任何配置,以便当部署新代码时,我可以引导所有请求提供更新的文件?
通过搜索这个主题,我发现,我们可以编写自定义方法来设置电子标签值。有什么配置可以帮助我这样做吗?
大多数时候我们都是热部署(在jboss管理控制台中上传war文件,不需要停机)。所以我怀疑在热部署期间是否会更新自定义的电子标签,因为我们在服务器启动时配置了它。
或者是否有办法在Web应用程序的web.xml文件中处理它?
我需要一个解决方案,可以使用浏览器缓存,直到下一个部署发生的js,css和字体文件。我不知道什么设置“过期”头。因为我们没有固定的部署周期。
如果您需要更多信息以得出解决方案,请告诉我。

pinkon5k

pinkon5k1#

由于您正在使用jboss部署应用程序,因此我猜您的页面不是静态的。
如果你不想给Cache-Control带来麻烦,一个简单的解决方案就是在每个资源url后面附加一个动态的“缓存bust”。所以你的资源url(例如在.jsp中)应该是这样的:

<link rel="stylesheet" href="styles.css?_=${cacheBust}">
<script type="text/javascript" src="script.js?_=${cacheBust}">

现在,您需要一个地方来为每个部署/重新部署生成一个新的cacheBust值。
启动时加载的HttpServlet

@WebServlet(loadOnStartup = 1) 
public class InitServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        super.init();
        getServletContext().setAttribute("cacheBust", UUID.randomUUID().toString());
    }

}

或者是ServletContextListener

@WebListener
public class InitListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        sce.getServletContext().setAttribute("cacheBust", UUID.randomUUID().toString());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

}
jq6vz3qz

jq6vz3qz2#

你希望浏览器缓存很少更改的文件。但有时它们 * 确实 * 更改了,然后你想触发浏览器缓存清除。比如:

<script type="text/javascript">
localStorage.clear();
</script>

但是,可靠的解决方案是在服务器端使用版本:

<link type="text/css" rel="stylesheet" href="/css/mystyles-1.01.css">
vyswwuz2

vyswwuz23#

根据this post,您可以通过更改响应头来禁用缓存。
您还可以将查询字符串添加到链接(请参见this post)。例如,您可以最初使用./design.css?v=1,而在下次更新design.css时将引用更改为./design.css?v=1。您可以动态更改编号

相关问题