SpringBoot cache-control 配置静态资源缓存 (以及其中的思考经历)

  昨天在部署项目时遇到一个问题,因为服务要部署到外网使用,中间经过了较多的网络传输限制,而且要加载arcgis等较大的文件,所以在部署后,发现页面loading需要很长时间,而且刷新也要重新从服务器下载文件。这当然是不能忍受的,即使在不考虑文件大小的情况下,我们也希望我们的静态文件如js, css, json, img等,可以在刷新的时候尽量不重新加载,这样我们的页面会变得更有效率即使在网络不好的状况下。

  那么问题来了:

    我们如何在刷新浏览器时,使自己的项目中的任何可控静态文件,被浏览器缓存?

  就简单说下我的思路和经历:(声明,作为一名前端,有些理解可能是跑偏的,欢迎指点。

                另文章有引用看到的不错知识的连接,传送门走起~

                文中的很多思考,后端可以略过不看,因为我对后台有很多不确定性

                如果你只是想迅速知道结果,请看直达第五条后面

  1.当我获得这个需求后,我的第一个想法是从服务器端或者偏后台的的方向去寻求解决方法。但是由于我们作为一名前端开发者,我们总要先检查自己的前端是否可以完成,以及放在那一部分较好。很遗憾,前端好象对此无能为力(如果你有,欢迎指点)。此时,我们基本确定了自己需要研究的方向。

  2.最简单的方式,打开百度,我们获得的第一类相关信息为SpringMVC 配置静态资源缓存,基本思路是通过在web.xml中配置filter,还需要通过Tomcat容器进行一些过滤配置。一篇关于Tomcat下MVC静态资源强缓存配置的文章~很遗憾,SpringBoot并不支持这种在web.xml中配置过滤器,显然这不是我们需要的。

  3.但我们至少缩小了我们的范围,继而我发现了页面在刷新请求资源时,使用的cache-contro为no-store.这时,由于我的SpringBoot项目,并没有进行特殊的配置,所以得出结论,如果不是SpringBoot内置的,就是通过Tomcat进行配置的。接着是另一篇传送门Tomcat配置Cache-Control~但是通过配置之后发现并没有改变这些资源的Cache-Control,所以再一次兴奋起来,你又证明了一个不太可行的方式。

  4.其实很少有文章或者资源讲述SpringBoot缓存静态资源的,有一部分是将数据请求的缓存,之后又问了几个师兄,又通过百度,发现了1.SpringBoot可以写类似于MVC的过滤类,通过过滤配置强缓存, 2. 通过SpringBoot +redis配置缓存我们的静态资源。这里事情来到了一个要写过滤类的代码,事情来到了一个转折,加上当时我有其他内容要修改,所以就把这个交给了我们后台的兄弟们。思路已经很清晰了,写过滤类,实现静态资源缓存。或者是更复杂的一些东西。但是实现,我就不行了。不过事情到这里并没有结束,,,因为有更好的方法

  这里有一些我觉得可以了解的资源:

     浏览器缓存原理

    彻底理解浏览器缓存机制

    浏览器三种刷新的区别

  5.今天将近中午的时候,此项目前端的修改基本完成的时候,其实后台的兄弟也觉得实在不行就写Filter,但还是想找一种更合理简单的方法,我觉得这是很好的。我又继续我们自己的思考,如果有,那么一定是在SpringBoot内部进行设置,但是我们百度的总是SpringBoot和一些插件相结合进行控制(ex: EhCache),我觉得是自己对后台不理解导致的搜索盲区,最终误打误撞,找到了理想的解决方法:

  通过配置application.properties

    #资源缓存时间,单位秒

    spring.resources.cache-period: 3600   

    # 开启gzip压缩

    spring.resources.chain.gzipped=true

    # 启用缓存
    spring.resources.chain.cache=false

  

  总算啰嗦完了!(想必你也是这种心情,终于听你哔哔完了)

  写这篇文章算是一个记录,这个问题从昨天产生到解决中间过了大概有一天时间。但是真正思考这个问题的时间可能并没有多久,对自己能解决结果,真的是很意外。又觉得是值得记录的,因为证明了我之前有时候想的,前端和后台的开发思想,计算机思想,应该是一致的。嗯,也这么长时间没写博客了,献丑献丑~

  (希望以后有时间把自己总结的前端的干货(想减少大家和我当时对前端的误解,其实前端的内容真的很多很多,就是总感觉这些大家只要看都能懂的,就总不想写。。)都能分享一下,哎~)

  希望各位看官多多点赞,让我多在首页待一待好不~_~

上一篇:解决input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能


下一篇:sql 查询分组后的数据总条数