这个问题的答案可能已经在网上了,但我不知道如何在没有得到不相关结果的情况下提问。在我使用 servlet 并具有web.xml
部署描述符的 Java Web 项目中,除了 servlets 之外,是否有办法为任何URL 资源创建自定义映射?例如,html 文件、Javascript 文件、图像、样式表等?
我问的原因与浏览器缓存有关。在 Web 项目的版本之间,如果资源被缓存,然后更新推出,浏览器通常会首先尝试加载缓存的版本。在 DOM 元素和 Javascript 函数已更改或更新的地方,这可能会导致更新的页面由于资源不同步而中断。
现在我听说了很多解决这个问题的方法:
- 将 URL 参数查询字符串添加到所有资源。因此,
index.html
成为index.html?v=1.2
在一个发布中,然后index.html?v=1.3
在发布之后,防止缓存重叠。我对此的担心是,并非所有浏览器都实现了尊重这一点的缓存策略。 问题:一个浏览器可能将文件缓存为index.html?v=1.3
,另一个浏览器可能只是index.html
在从缓存中加载文件后缓存并添加 URL 参数,而另一个浏览器可能根本不缓存带有 URL 参数的文件。 touch
版本之间服务器上的所有文件。这样,当发送资源的 HTTP 请求,并且响应头显示检索到的文件的时间戳比缓存的时间戳更新时,它将重新加载。问题:同样,我不确定所有浏览器都实施任何此类缓存策略。- 在我的 Javascript 文件中实现所有版本必须匹配的逻辑,并使加载的第一个Javascript 文件成为提供主版本密钥的动态(不可缓存)文件。任何不同步的 javascript 文件(即版本与主版本不匹配,因为它已被缓存)将被强制重新加载。问题:这实际上听起来是个不错的方法,但是当我知道过去缓存一直是个问题时,依赖 Javascript 文件中添加的逻辑是很可怕的;比如,我的新“版本检查”逻辑会被加载吗?
- 将版本与文件名合并。因此,
index.html
变为index.1.2.html
。这将是万能的解决方案,因为缓存是在文件名级别完成的,当我们移动到 1.3 版时,浏览器不可能已经index.1.3.html
缓存了。问题:开发端的源代码控制管理成为一场噩梦......
...除非,有一种方法可以映射index.1.3.html
到简单命名的服务器端资源index.html
。这又回到了我最初的问题,这可以在网络项目中完成吗?这甚至推荐吗?我知道web.xml
,我们可以将 URL 模式映射到 servlet,但是我们可以将 URL 模式映射到其他资源吗?似乎在版本之间只维护一个描述符文件很容易,因此在客户端,似乎所有文件都是新的,所以第一次加载新版本时肯定会有加载命中,但是这样就可以消除缓存不同步的资源。