Редактировать
В случае, если вы используете Spring Boot, теперь намного проще предотвратить кэширование измененных файлов.
Все, что вам нужно сделать, это добавить это в приложение.properties:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
Если вы используете Thymeleaf или FreeMarker, он полностью настраивается автоматически.Если вы используете JSP, вам нужно вручную объявить ResourceUrlEncodingFilter.
Подробнее читайте здесь: http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-static-content
Далее следует моя "старая" запись, которая также работает, но требует дополнительной работы.
Поскольку вы используете Java, есть вероятность, что вы также используете maven для управления своим проектом.
В этом случае, чтобы повысить производительность и убедиться, что ни один браузер не кэширует ваши статические ресурсы при новомВыпуск вашего программного обеспечения, вы должны объединить все ваши таблицы стилей и файлы JavaScript в один файл их типа, и вы должны изменить URL-адреса своих ресурсов при создании нового выпуска.
К счастью, Maven может сделатьвсе это для вас во время сборки.Вам понадобятся minify-maven-plugin
и maven-replacer-plugin
.
Этот отрывок из pom.xml должен помочь вам начать:
<properties>
<timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
</properties>
<plugin>
<groupId>com.samaxes.maven</groupId>
<artifactId>minify-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>minify-css</id>
<phase>process-resources</phase>
<goals>
<goal>minify</goal>
</goals>
<configuration>
<linebreak>-1</linebreak>
<cssSourceDir>resources/css</cssSourceDir>
<cssSourceFiles>
<cssSourceFile>bootstrap.css</cssSourceFile>
<cssSourceFile>style.css</cssSourceFile>
</cssSourceFiles>
<cssTargetDir>resources/css</cssTargetDir>
<cssFinalFile>${timestamp}.css</cssFinalFile>
</configuration>
</execution>
<execution>
<id>minify-js</id>
<phase>process-resources</phase>
<goals>
<goal>minify</goal>
</goals>
<configuration>
<linebreak>-1</linebreak>
<jsSourceDir>resources/js</jsSourceDir>
<jsSourceFiles>
<jsSourceFile>jquery.js</jsSourceFile>
<jsSourceFile>bootstrap.js</jsSourceFile>
<jsSourceFile>script.js</jsSourceFile>
</jsSourceFiles>
<jsTargetDir>resources/js</jsTargetDir>
<jsFinalFile>${timestamp}.js</jsFinalFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.2</version>
<executions>
<execution>
<id>replaceDynPartInResourcePath</id>
<phase>prepare-package</phase>
<goals>
<goal>replace</goal>
</goals>
<configuration>
<ignoreMissingFile>false</ignoreMissingFile>
<basedir>${project.build.directory}</basedir>
<file>${project.artifactId}/WEB-INF/views/header.jsp</file>
<regex>false</regex>
<replacements>
<replacement>
<token>$dynamicResourceNamePart$</token>
<value>${timestamp}</value>
</replacement>
</replacements>
</configuration>
</execution>
</executions>
</plugin>
Вот как включить ваши статические ресурсы в заголовок.JSP
<c:choose>
<c:when test="${not fn:contains(pageContext.request.serverName, 'localhost') and empty param.nocombine}">
<link href="${pageContext.request.contextPath}/resources/css/$dynamicResourceNamePart$.min.css" rel="stylesheet" type="text/css" />
<script src="${pageContext.request.contextPath}/resources/js/$dynamicResourceNamePart$.min.js" type="text/javascript"></script>
</c:when>
<c:otherwise>
<link href="${pageContext.request.contextPath}/resources/css/bootstrap.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/resources/css/style.css" rel="stylesheet">
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/jquery.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/bootstrap.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/script.js"></script>
</c:otherwise>
</c:choose>