当前位置: 首页 > 知识库问答 >
问题:

JSF2静态资源缓存

萧奇
2023-03-14

Glassfish 3.1.2,Mojarra 2.1.6,SSL已激活

也是一篇关于资源缓存的好文章。在我们的应用服务器中,SSL被激活。我们看到静态资源(图像、脚本、css)没有缓存。

下面是我的测试筛选器:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String uri = httpRequest.getRequestURI();
        if (GET_METHOD.equalsIgnoreCase(httpRequest.getMethod()) && uri.contains(ResourceHandler.RESOURCE_IDENTIFIER)) {
            httpResponse.setDateHeader("Expires", System.currentTimeMillis() + 2419200000L); // 1 month in future.
            httpResponse.setDateHeader("Last-Modified", System.currentTimeMillis() - 2419200000L); // 1 month in past.
            httpResponse.setHeader("Cache-Control", "public"); // Secure caching
        }
    }
    chain.doFilter(request, response);
}
  • 过期:确定。它是一个静态资源,不会改变,因此我们将到期日期设置在未来的一个月。
  • 上次修改:不确定。我读到,将此设置为过去也会影响缓存
  • 缓存控制:OK。允许安全缓存。安全影响?

此设置是否有影响?我也读过很多文章,其中提到应该通过过滤器禁用缓存。我看到的唯一问题是用户可能会在新版本上遇到问题。样式和脚本可以在新版本中更改,但浏览器会忽略新版本并使用缓存中的文件。

共有1个答案

蓬长恨
2023-03-14

您只需要设置cache-controlexpireslast-modified已在默认情况下设置为resourcehandler(并将覆盖筛选器设置的值)。last-modified必须表示所讨论的资源的上次修改的时间戳。您可以通过servletContext.getResource(path).OpenConnection().getLastModified()获得它。但无论如何你都不需要在这里设置。只需让resourcehandler处理即可。

至于版本控制,只要正确使用资源库即可。您可以将与regex模式\d+(_\d+)*匹配的版本文件夹放在库文件夹中,resourcehandler将为最新版本提供服务。

例如。

/resources/libraryname/1_0/js/file.js
/resources/libraryname/1_1/js/file.js
/resources/libraryname/1_2/js/file.js

下面将从1_2中获取一个:

<h:outputScript library="libraryname" name="js/file.js" />
 类似资料:
  • 每个网站都需要静态资源:图片、样式表、网站图标(favicon)等。在这种情况下,您可以在项目的根目录下创建一个名为 static 的目录。 放入 该目录中的每个文件都将被复制到 生成的 build 文件夹中,并保留目录的层级结构。例如,如果您将名为 sun.jpg 的文件添加到 static 文件夹中,则该文件将被复制到 build/sun.jpg 路径。 这意味着: 对于 baseUrl: '

  • 为优化站点性能,静态资源应该带有恰当的'Cache-Control'值与其他必要的头。配置一个ResourceHttpRequestHandler处理器服务静态资源请求不仅会读取文件的元数据并填充'Last-Modified'头的值,正确配置时'Cache-Control'头也会被填充。【这段翻得还不是很清晰】 你可以设置ResourceHttpRequestHandler上的cachePerio

  • JS 代码中引用媒体文件 可以直接在代码中使用 ES6 的 import 语法引入文件并在 JSX 中使用,目前仅支持图片类型的媒体文件。 JSON 中引用媒体文件 当你需要在 app.json 中配置使用的本地媒体文件(比如导航栏图片地址)时,可以将使用到的媒体文件放置到 src 下的某个目录下,并在 build.json 中将其配置到 constantDir 字段的数组中,示例如下: {

  • 相关: 公共基础路径 相关: assetsInclude 配置项 将资源引入为 URL 服务时引入一个静态资源会返回解析后的公共路径: import imgUrl from './img.png' document.getElementById('hero-img').src = imgUrl 例如,imgUrl 在开发时会是 /img.png,在生产构建后会是 /assets/img.2d8e

  • 所有的Markdown文件都通过Vite处理编译成Vue组件。你可以并且应当使用相对URL引用静态资源。 ![An image](./image.png) 你可以在你的Markdown文件、主题中的*.vue组件、样式和纯.css文件使用绝对公共路径(基于项目根目录)或相对路径(基于你的文件系统)。如果你使用过vue-cli或webpack的file-loader,后者更符合你的习惯。 常见的图

  • Fes.js 基于 html-webpack-plugin在新窗口打开 实现的模板功能,默认 HTML模板 是: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewp