Если вы не хотите загружать приложение с помощью Apache HTTPD, вы можете использовать пользовательский фильтр сервлета или повторно использовать существующий Url Rewrite Filter . Этот фильтр основан на mod_rewrite
Apache и предлагает аналогичные возможности. Другими словами, это позволило бы реализовать то же решение, что и PHP другого ответа.
Я видел фильтр перезаписи URL раньше. Не могли бы вы рассказать, как бы я это использовал? Я действительно не совсем понимаю, как применить фильтр к этой проблеме, поскольку я бы не стал вызывать функцию JSP / JSTL, обернутую вокруг каждого включенного файла JS / CSS, и я понятия не имею, как получить дата изменена из файла, который находится в WAR.
Что ж, идея заключалась в том, чтобы имитировать именно «PHP-решение» ответа, с которым вы связались (давайте назовем этот вариант 1):
- Настройте фильтр перезаписи URL для перезаписи любого запроса, чтобы сказать
/css/my.123456.css
в /css/my.css
- Реализация
Servlet
, которая бы получала объект File
для данного ресурса в WAR и вставила File#lastModified()
в возвращенный путь к этому ресурсу.
- Вызовите
Servlet
из JSP для CSS.
Другой подход (вариант 2) заключается в добавлении уникальной строки запроса к URL-адресу статического содержимого, например время запуска сервера:
- Укажите время запуска сервера в области приложения от
ServletContextListener
(скажем, под ключом "key"
).
В тебе JSP
<link rel="stylesheet" type="text/css" href="/css/my.css?${key.startupTime}">
Pro: URL больше не переписывается. Против: Менее оптимальный (контент будет запрашиваться при перезапуске), но приемлемый.
При поиске в Интернете некоторого кода, который мог бы помочь реализовать шаг # 2 варианта 1, я обнаружил, что Spring o.s.w.s.ResourceServlet
, который делает нечто подобное, вы можете посмотреть на его исходный код. Но, читая его Javadoc более внимательно, я понял, что этот сервлет на самом деле именно то, что вы ищете. Отобразите это так:
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
И установите для его свойства applyLastModified
значение true
. Насколько я понимаю, Javadoc - это то, что нужно. Это вариант 3, и это IMO лучший вариант, если добавление зависимости от этого сервлета не является проблемой.