有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

spring停止使用Java缓存文件

我试图避免缓存我的自定义js文件,因为我经常更改它们,而客户端缓存旧的js文件

所以我正在尝试一个解决方案(http://www.baeldung.com/cachable-static-assets-with-spring-mvc),但它不起作用。它根本不会像预期的那样更改js文件的名称

我使用的是SpringMVC5

WebMVCConfiguer

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler()
                .setCacheControl(CacheControl.maxAge(1, TimeUnit.SECONDS))
                .resourceChain(false)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
}

HTML

<script type="text/javascript" src="<c:url value="../resources/js/pageJS/login.js" />"></script>

网络。xml

<filter>
    <filter-name>resourceUrlEncodingFilter</filter-name>
    <filter-class>
        org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>resourceUrlEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

知道你在干什么吗

../resources/js/pageJS/login.js保持相同的名称


共 (3) 个答案

  1. # 1 楼答案

    在控制器类的请求映射方法中尝试以下操作:-

    @RequestMapping("/test")
    public ModelAndView preventCache(HttpServletResponse response){
        response.setHeader("Expires", "Tue, 01 Jan 2001 00:00:01 GMT");
        response.setHeader("Last-Modified", new Date().toString());
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");
        return new ModelAndView("viewName");
    }
    
  2. # 2 楼答案

    添加过期或缓存控制标头

    标签:服务器

    这条规则有两个方面:

    • 对于静态组件:通过设置far实现“永不过期”策略 future Expires标头
    • 对于动态组件:使用适当的缓存控件标头 帮助浏览器处理有条件的请求

    网页设计越来越丰富,这意味着页面中有更多的脚本、样式表、图像和Flash。首次访问您的页面的访问者可能需要发出多个HTTP请求,但通过使用Expires标头,可以使这些组件可缓存。这避免了后续页面视图中不必要的HTTP请求。Expires头文件通常与图像一起使用,但它们应该用于所有组件,包括脚本、样式表和Flash组件

    浏览器(和代理)使用缓存来减少HTTP请求的数量和大小,从而加快网页加载速度。web服务器在HTTP响应中使用Expires头告诉客户端组件可以缓存多长时间。这是一个遥远的Expires标题,告诉浏览器此响应在2010年4月15日之前不会过时

      Expires: Thu, 15 Apr 2010 20:00:00 GMT
    

    如果您的服务器是Apache,请使用ExpiresDefault指令设置相对于当前日期的过期日期。ExpiresDefault指令的这个示例将Expires日期设置为从请求时算起10年

      ExpiresDefault "access plus 10 years"
    

    请记住,如果您使用的是far future Expires标头,则每当组件发生更改时,都必须更改组件的文件名。在雅虎!我们通常将此步骤作为构建过程的一部分:在组件的文件名中嵌入一个版本号,例如yahoo_2.0.6。js

    使用far future Expires标头仅在用户已访问您的站点后才会影响页面视图。当用户第一次访问您的站点并且浏览器的缓存为空时,它对HTTP请求的数量没有影响。因此,这种性能改进的影响取决于用户使用预处理缓存访问页面的频率。(一个“预处理缓存”已经包含页面中的所有组件。)我们在雅虎测量了这个!并发现使用预处理缓存的页面浏览量为75-85%。通过使用far future Expires标头,可以增加浏览器缓存并在后续页面视图中重复使用的组件数量,而无需通过用户的Internet连接发送单个字节

    利用浏览器缓存

    当PageSpeed Insights检测到来自服务器的响应不包括缓存头,或者如果资源被指定为仅在短时间内缓存,则会触发此规则

    概述

    通过网络获取资源既慢又贵:下载可能需要在客户端和服务器之间进行多次往返,这会延迟处理并可能阻止页面内容的呈现,同时也会给访问者带来数据成本。所有服务器响应都应指定缓存策略,以帮助客户端确定是否以及何时可以重用以前获取的响应

    推荐

    每个资源都应该指定一个明确的缓存策略,以回答以下问题:资源是否可以缓存,由谁缓存,缓存多长时间,以及在缓存策略过期时如何有效地重新验证。当服务器返回响应时,它必须提供缓存控制和ETag头:

    • 缓存控制定义单个响应的方式和持续时间 可以通过浏览器和其他中间缓存进行缓存。学习 更多信息,请参见使用缓存控制进行缓存
    • ETag提供了一个由服务器自动发送的重新验证令牌 浏览器,以检查自上次删除资源以来资源是否已更改 是被要求的。要了解更多信息,请参阅使用验证缓存响应 埃塔格

    要确定站点的最佳缓存策略,请使用以下指南:

    • 定义最优缓存控制策略
    • 使缓存的响应失效和更新
    • 缓存检查表

    我们建议静态资产或不经常更改的资产的缓存时间至少为一周,最好为一年。如果您需要精确控制资源何时失效,我们建议使用URL指纹或版本控制技术-请参阅上面的失效和更新缓存响应链接

  3. # 3 楼答案

    似乎你需要使用

    registry.addResourceHandler("/js/**")
                .addResourceLocations("/js/")
    

    而不是

    registry.addResourceHandler()
    

    取决于登录的位置。js文件

    另外,将1秒改为30秒,给Spring一些喘息的空间:)