При использовании Spring Boot + Freemarker для разработки веб-проекта, поскольку некоторые статические файлы относительно велики, доступ к ним на ПК не окажет большого влияния При доступе на мобильном телефоне, особенно при доступе к нему с трафиком, скорость будет намного медленнее, и это будет потреблять много трафика.
Перехватывая пакеты запросов, вы можете обнаружить, что вам нужно загружать статические файлы каждый раз, когда вы заходите на страницу.Если у вас мало денег, вы можете разместить статические файлы на CDN для ускорения доступа или использовать Nginx для кешировать статические файлы.
Сегодня я представлю еще один способ оптимизации кэширования, который использует механизм кэширования Spring для кэширования статических файлов.Чтобы настроить кэширование статических файлов в Spring Boot, вам нужно всего лишь добавить в файл конфигурации следующую конфигурацию:
# 资源缓存时间,单位秒
spring.resources.cache-period=604800
# 开启gzip压缩
spring.resources.chain.gzipped=true
# 启用缓存
spring.resources.chain.cache=false
Конфигурация может обратиться к документации:docs.spring.IO/весенняя загрузка…Раздел SPRING RESOURCES HANDLING
После добавления конфигурации кеша, после посещения страницы, загруженные статические ресурсы будут закэшированы, и загрузка не будет перезапрошена при повторном посещении, по захвату пакета видно, что он действительно закэширован.
В графе Размер есть из кеша памяти, ресурсы кэшируются в памяти браузера, а некоторые файлы кэшируются на диске, то есть из кеша диска.
Цель оптимизации достигнута, но есть небольшая проблема, которая не решена, то есть, если мои файлы ресурсов будут изменены, например, файлы css изменены, после того, как сервер будет освобожден, на сервере все еще будет кеш. сторона пользователя.
Наилучший эффект достигается при изменении файла или при перезапуске программы на сервере, запрос пользователя должен загрузить последние ресурсы сервера, а кэшированное содержимое используется при отсутствии перезапуска, чтобы пользователь мог видеть изменение немедленно последнего содержания.
Мы можем использовать номер версии для решения этой проблемы, то есть добавить номер версии после статического ресурса и изменить номер версии при изменении ресурса, чтобы не было проблем.
Он используется следующим образом:
<link rel="stylesheet" href="css/main-app.css?version=${version!}"/>
Использование очень простое, ключ в том, откуда берется значение версии?
Мы можем установить это значение через код перед запуском:
System.setProperty("version", version);
Это значение может быть передано через аргументы основного метода и динамически передано программе в сценарии стартового проекта.Сценарий запуска может получить значение MD5 jar программы в качестве номера версии, так что когда программа перезапустится, номер версии изменится Кэш недействителен.
Затем получите это значение в фильтре и установите его в запросе, чтобы использовать его на каждой странице.
String version = System.getProperty("version");
req.setAttribute("version", version == null ? "1.0.0" : version);
В дополнение к этому методу передачи параметров вы также можете настроить упакованный плагин и заменить версию конкретным содержимым при упаковке.
Упомянутый выше метод заключается в управлении изменением файла путем создания версии самостоятельно. Фактически, Spring Mvc уже предоставляет функцию управления версиями статических файлов. Есть два способа. Один из них — сгенерировать номер версии с помощью MD5 файла ресурс, и содержимое файла меняется.Да, MD5, должно быть, тоже изменился. Другой — добавить путь к ресурсу с номером версии.
MD5
Добавьте следующую конфигурацию в файл свойств:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
Увеличение обработки URL:
@ControllerAdvice
public class ControllerConfig {
@Autowired
ResourceUrlProvider resourceUrlProvider;
@ModelAttribute("urls")
public ResourceUrlProvider urls() {
return this.resourceUrlProvider;
}
}
Страница используется следующим образом:
<link rel="stylesheet" type="text/css" href="${urls.getForLookupPath('/css/main-app.css')}">
После компиляции он станет следующим:
<link rel="stylesheet" type="text/css" href="/css/main-app-4v371326bb93ce4b611853a309b69b33.css">
номер версии
Добавьте следующую конфигурацию в файл свойств:
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/**,/v1.0.0/**
spring.resources.chain.strategy.fixed.version=v1.0.0
Страница используется следующим образом:
<script type="text/javascript" src="${urls.getForLookupPath('/js/main.js')}"></script>
После компиляции он станет следующим:
<script type="text/javascript" src="/v1.0.0/js/main.js"></script>
Независимо от того, какой метод используется, эффект будет достигнут, и нагрузка не будет слишком большой.Оптимизация бесконечна, и она закончена.