Служите статическим ресурсам с помощью Spring
1. обзор
В этой статье рассказывается, какserve static resources with Spring - с использованием конфигурации XML и Java.
Дальнейшее чтение:
Кэшируемые статические активы с помощью Spring MVC
В этой статье показано, как кэшировать статические ресурсы, такие как файлы Javascript и CSS, при их обслуживании в Spring MVC.
Введение в WebJars
Краткое и практическое руководство по использованию WebJars с Spring.
Сокращение ресурсов JS и CSS с Maven
Краткое руководство по использованию Maven для минимизации файлов Javascript и CSS в веб-проекте Java.
2. Конфигурация XML
Если вам нужно пойти по старинке с конфигурацией на основе XML, вы можете эффективно использовать элементmvc:resources, чтобы указать на расположение ресурсов с определенным общедоступным шаблоном URL.
Например, следующая строка будет обслуживать все запросы ресурсов, поступающих с шаблоном общедоступного URL, например «/resources/**», путем поиска в каталоге «/resources/» в корневой папке нашего приложения.
Теперь мы можем получить доступ к файлу CSS, как на следующей html-странице:
Пример 2.1.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
" rel="stylesheet">
Home
Hello world!
3. ResourceHttpRequestHandler
Spring 3.1. представилResourceHandlerRegistry для настройкиResourceHttpRequestHandlers для обслуживания статических ресурсов из пути к классам, WAR или файловой системы. Мы можем настроитьResourceHandlerRegistry программно внутри нашего класса конфигурации веб-контекста.
3.1. Обслуживание ресурса, хранящегося в WAR
Чтобы проиллюстрировать это, мы будем использовать тот же URL-адрес, что и раньше, чтобы указать наmyCss.css, но теперь фактический файл будет расположен в папке WARwebapp/resources, где статические ресурсы должны быть размещены при развертывании. Приложения Spring 3.1+:
Пример 3.1.1.
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
}
Давайте проанализируем примерный бит. Сначала мы настраиваем внешний путь URI, добавляя определение обработчика ресурса. Затем мы сопоставляем этот внешний URI-путь внутри с физическим путем, где ресурсы фактически расположены.
Конечно, мы можем определить несколько обработчиков ресурсов, используя этот простой, но гибкий API.
Теперь - следующая строка на страницеhtml предоставит нам ресурсmyCss.css внутри каталогаwebapp/resources:
" rel="stylesheet">
3.2. Обслуживание ресурса, хранящегося в файловой системе
Допустим, мы хотим обслуживать ресурс, хранящийся в каталоге/opt/files/, всякий раз, когда приходит запрос на общедоступный URL-адрес, соответствующий шаблону:/files/**. Мы просто настраиваем шаблон URL и сопоставляем его с этим конкретным местоположением на диске:
Пример 3.2.1.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/files/**")
.addResourceLocations("file:/opt/files/");
}
* (Для пользователей Windows: аргумент, переданныйaddResourceLocations в этом примере, будет «file:///C:/opt/files/»).
После настройки местоположения ресурса мы можем использовать сопоставленный шаблон URL в нашихhome.html вload an image stored in the file system следующим образом:
Пример 3.2.2.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
" rel="stylesheet">
Home
Hello world!
">
3.3. Настройка нескольких расположений для ресурса
Что если мы хотим найти ресурс в нескольких местах?
Мы можем включить несколько местоположений с помощью методаaddResourceLocations. Список мест будет искать в порядке, пока ресурс не будет найден. Давайте посмотрим на пример 3.3.1.
Пример 3.3.1
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/","classpath:/other-resources/");
}
Следующий запрос curl отобразит страницуHello.html, хранящуюся либо в папке приложенияwebappp/resources, либо в папкеother-resources в пути к классам.
curl -i http://localhost:8080/handling-spring-static-resources/resources/Hello.html
4. НовыйResourceResolvers
Весна 4.1. предоставляет - с новымResourcesResolvers - различные типы преобразователей ресурсов, которые можно использовать для оптимизации производительности браузера при загрузке статических ресурсов. Эти средства распознавания могут быть связаны и кэшированы в браузере для оптимизации обработки запросов.
4.1. PathResourceResolver
Это самый простой распознаватель, и его цель - найти ресурс по общедоступному шаблону URL. Фактически, еслиResourceResolver не добавляется кResourceChainRegistration, это преобразователь по умолчанию.
Давайте посмотрим на пример:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/","/other-resources/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
На что обратить внимание:
-
Мы регистрируемPathResourceResolver в цепочке ресурсов как единственныйResourceResolver в ней. Смотрите раздел 4.3. чтобы проверить, как объединить более одногоResourceResolver.
-
Обслуживаемые ресурсы будут кэшироваться в браузере на 3600 секунд.
-
Наконец, цепочка настроена методомresourceChain(true).
Теперь - html-код, который вместе сPathResourceResolver находит скриптfoo.js вwebapp/resources папкиwebapp/other-resources:
">
4.2. EncodedResourceResolver
Этот преобразователь пытается найти закодированный ресурс на основе значения заголовка запросаAccept-Encoding.
Например, нам может потребоваться оптимизировать пропускную способность, обслуживая сжатую версию статического ресурса с использованием кодирования содержимогоgzip.
Чтобы настроитьEncodedResourceResolver,, нам просто нужно настроить его вResourceChain так же, как мы настроилиPathResourceResolver, как в следующей строке кода:
registry
.addResourceHandler("/other-files/**")
.addResourceLocations("file:/Users/Me/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new EncodedResourceResolver());
По умолчаниюEncodedResourceResolver настроен для поддержки кодированияbr иgzip.
Итак, следующий запросcurl получит заархивированную версию файлаHome.html, находящуюся в файловой системе в каталогеUsers/Me/:
curl -H "Accept-Encoding:gzip"
http://localhost:8080/handling-spring-static-resources/other-files/Hello.html
Обратите внимание, какwe are setting the header’s “Accept-Encoding” value to gzip - это важно, потому что этот конкретный преобразователь сработает, только если содержимое gzip допустимо для ответа.
Наконец, обратите внимание, что, как и прежде, сжатая версия будет оставаться доступной в течение периода времени, в течение которого она кэшируется в браузере - что в данном случае составляет 3600 секунд.
4.3. ЦепочкаResourceResolvers
Чтобы оптимизировать поиск ресурсов,ResourceResolvers может делегировать обработку ресурсов другим преобразователям. Единственный преобразователь, который не может делегировать цепочку, - этоPathResourceResolver, который следует добавить в конец цепочки.
Фактически, еслиresourceChain не установлен наtrue, то по умолчанию для обслуживания ресурсов будет использоваться толькоPathResourceResolver. В Примере 4.3.1. мы связываемPathResourceResolver для разрешения ресурса, еслиGzipResourceResolver завершается неудачно.
Пример 4.3.1.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/js/**")
.addResourceLocations("/js/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new GzipResourceResolver())
.addResolver(new PathResourceResolver());
}
Теперь, когда мы добавили шаблон/js/** кResourceHandler, давайте включим ресурсfoo.js, расположенный в каталогеwebapp/js/, на нашу страницуhome.html, как в примере 4.3. .2.
Пример 4.3.2.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
" rel="stylesheet" />
">
Home
This is Home!
" />
5. Дополнительная конфигурация безопасности
При использовании Spring Security важно разрешить доступ к статическим ресурсам. Нам нужно будет добавить соответствующие разрешения для доступа к URL ресурса:
6. Заключение
В этой статье мы продемонстрировали различные способы обслуживания статических ресурсов в приложении Spring.
Конфигурация ресурсов на основе XML - этоa “legacy” option, которую можно использовать, если вы еще не можете перейти по маршруту конфигурации java.
Spring 3.1. came out with- базовая программная альтернатива через объектResourceHandlerRegistry.
И напоследок - новый нестандартный объектResourceResolvers иResourceChainRegistrationshipped with Spring 4.1. предлагает функции оптимизации загрузки ресурсов, такие как кэширование и цепочка обработчиков ресурсов, для повышения эффективности обслуживания статических ресурсов.
Как всегда, доступен полный примерover on Github.