Служить статическим ресурсам с помощью Spring

Служите статическим ресурсам с помощью Spring

1. обзор

В этой статье рассказывается, какserve static resources with Spring - с использованием конфигурации XML и Java.

Дальнейшее чтение:

Кэшируемые статические активы с помощью Spring MVC

В этой статье показано, как кэшировать статические ресурсы, такие как файлы Javascript и CSS, при их обслуживании в Spring MVC.

Read more

Введение в WebJars

Краткое и практическое руководство по использованию WebJars с Spring.

Read more

Сокращение ресурсов JS и CSS с Maven

Краткое руководство по использованию Maven для минимизации файлов Javascript и CSS в веб-проекте Java.

Read more

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!

image">

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:


    Home


    

This is Home!

bunny hop image" />

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.