Прекратить кеширование файлов с помощью Java

Я стараюсь не кэшировать свой собственный файл js, потому что я часто их меняю, а клиент кэширует старые файлы js.

Итак, я пытаюсь найти решение (http://www.baeldung.com/cachable-static-assets-with-spring-mvc), но оно не работает. Он просто не меняет имя файла js, как предполагалось.

Я использую Spring MVC 5

WebMvcConfigurer

@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>

web.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сохраняет то же имя

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
898
3

Ответы 3

Кажется, вам нужно использовать

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

вместо

registry.addResourceHandler()

в зависимости от расположения файла login.js

Кроме того, измените 1 секунду на 30 секунд, чтобы дать Spring передышку :)

Я также пробовал registry.addResourceHandler("../webapp/resources/**").setCac‌​hePeriod(0);, но он все еще кеширует.

user9565299 28.03.2018 18:43

Попробуйте это в методе сопоставления запросов вашего класса контроллера: -

@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");
}

У меня вроде 50 контроллеров ModelAndView. конечно есть лучший способ

user9565299 28.03.2018 18:52

есть фильтр для них или что-то в этом роде. в противном случае у вас также может быть некоторое количество просмотров :-)

kakabali 28.03.2018 18:53

ты можешь быть более конкретным? Я новичок в этом

user9565299 28.03.2018 18:54

иметь общий метод в родительском классе или что-то в этом роде и унаследовать этот класс этим методом? а добавление во все методы?

kakabali 28.03.2018 18:54

по крайней мере, сначала попробуйте, а затем можно будет приступить к импровизации :-)

kakabali 28.03.2018 18:55

Добавить заголовок Expires или Cache-Control

тег: сервер

У этого правила есть два аспекта:

  • Для статических компонентов: реализуйте политику «Никогда не истекает», задав далеко future Expires заголовок
  • Для динамических компонентов: используйте соответствующий заголовок Cache-Control для помочь браузеру с условными запросами

Дизайн веб-страниц становится все богаче и богаче, а это означает, что на странице появляется больше скриптов, таблиц стилей, изображений и Flash. Первому посетителю вашей страницы, возможно, придется сделать несколько HTTP-запросов, но с помощью заголовка Expires вы сделаете эти компоненты кэшируемыми. Это позволяет избежать ненужных HTTP-запросов при последующих просмотрах страницы. Заголовки Expires чаще всего используются с изображениями, но их следует использовать во всех компонентах, включая скрипты, таблицы стилей и компоненты Flash.

Браузеры (и прокси) используют кеш, чтобы уменьшить количество и размер HTTP-запросов, что ускоряет загрузку веб-страниц. Веб-сервер использует заголовок Expires в HTTP-ответе, чтобы сообщить клиенту, как долго компонент можно кэшировать. Это заголовок Expires в далеком будущем, сообщающий браузеру, что этот ответ не будет устаревшим до 15 апреля 2010 года.

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

Если ваш сервер Apache, используйте директиву ExpiresDefault, чтобы установить дату истечения срока действия относительно текущей даты. Этот пример директивы ExpiresDefault устанавливает дату истечения срока действия через 10 лет с момента запроса.

  ExpiresDefault "access plus 10 years"

Имейте в виду, что если вы используете заголовок Expires из далекого будущего, вы должны изменять имя файла компонента всякий раз, когда компонент изменяется. В Yahoo! мы часто делаем этот шаг частью процесса сборки: номер версии встроен в имя файла компонента, например yahoo_2.0.6.js.

Использование заголовка Expires в далеком будущем влияет на просмотры страниц только после того, как пользователь уже посетил ваш сайт. Это не влияет на количество HTTP-запросов, когда пользователь посещает ваш сайт впервые, а кеш браузера пуст. Следовательно, влияние этого улучшения производительности зависит от того, как часто пользователи обращаются к вашим страницам с загруженным кешем. («Заполненный кеш» уже содержит все компоненты страницы.) Мы измерили это в Yahoo! и обнаружил, что количество просмотров страниц с заполненным кешем составляет 75-85%. Используя заголовок Expires в далеком будущем, вы увеличиваете количество компонентов, которые кэшируются браузером и повторно используются при последующих просмотрах страницы, без отправки ни одного байта через Интернет-соединение пользователя.

Используйте кеширование браузера

Это правило срабатывает, когда PageSpeed ​​Insights обнаруживает, что ответ от вашего сервера не включает заголовки кэширования или если ресурсы указаны для кэширования только на короткое время.

Обзор

Получение ресурсов по сети является как медленным, так и дорогостоящим: для загрузки может потребоваться несколько циклов обмена между клиентом и сервером, что задерживает обработку и может блокировать отображение содержимого страницы, а также требует затрат на передачу данных для посетителя. Все ответы сервера должны указывать политику кэширования, чтобы помочь клиенту определить, можно ли и когда он может повторно использовать ранее полученный ответ.

Рекомендации

Каждый ресурс должен указывать явную политику кэширования, которая отвечает на следующие вопросы: можно ли кэшировать ресурс и кем, на какой срок и, если применимо, как его можно эффективно перепроверить по истечении срока действия политики кэширования. Когда сервер возвращает ответ, он должен предоставить заголовки Cache-Control и ETag:

  • Cache-Control определяет, как и как долго индивидуальный ответ могут кэшироваться браузером и другими промежуточными кешами. Учить подробнее см. кэширование с помощью Cache-Control.
  • ETag предоставляет токен повторной валидации, который автоматически отправляется браузер, чтобы проверить, изменился ли ресурс с момента последнего был запрошен. Чтобы узнать больше, см. Проверка кешированных ответов с помощью ETags.

Чтобы определить оптимальную политику кеширования для вашего сайта, воспользуйтесь следующими руководствами:

  • Определение оптимальной политики Cache-Control
  • Аннулирование и обновление кешированных ответов
  • Контрольный список кеширования

Мы рекомендуем минимальное время кеширования в одну неделю и предпочтительно до одного года для статических ресурсов или ресурсов, которые меняются нечасто. Если вам нужен точный контроль над тем, когда ресурсы становятся недействительными, мы рекомендуем использовать методику снятия отпечатков URL или управления версиями - см. Ссылку «Аннулирование и обновление кешированных ответов» выше.

Другие вопросы по теме