Почему заголовок Range не будет работать для статических ресурсов, размещенных в Spring Boot WAR с использованием встроенного Tomcat? - PullRequest
0 голосов
/ 31 августа 2018

У меня WAR WAR Spring Boot 2.0 с использованием WebMVC со встроенным Tomcat 8.5, и я размещаю свои статические ресурсы из WAR.

Запрос на статический ресурс, включающий Range: bytes=0-, завершается неудачно с HTTP 416 (Range Not Satisfiable), тогда как тот же запрос без заголовка Range работает нормально.

Только для контекста, рассматриваемый статический файл - это видео .mp4, которое браузер запрашивает с заголовком Range, поскольку на файл ссылается элемент video.

Проходя через отладчик, я вижу причину в том, что HttpRange.toResourceRegion() не может определить длину ресурса. (Вернее, возвращаемая длина -1.) Причина в том, что, поскольку URL ресурса не является URL файла, он пытается открыть соединение с URL и вызвать getContentLength() в соединении, а WarURLConnection этого не делает. переопределить реализацию URLConnection по умолчанию, возвращающую -1.

Я хочу назвать это ошибкой в ​​Spring и / или встроенным Tomcat, но если бы это было так, я чувствую, что кто-то другой уже сообщил бы об этом (и я не могу найти никаких доказательств этого). Я делаю что-то необычное здесь?

Или, может быть, это действительно работает для всех остальных? Может, есть какой-то волшебный весенний конфиг, который я пропустил? (Я сомневаюсь, что это связано с автоконфигурацией Spring Boot, но я должен упомянуть здесь, что у меня большая часть этого пока отключена, так как я переношу не-Boot приложение в Boot.)

Я понимаю, что, возможно, смогу обойти эту проблему, обработав этот запрос ресурса «вручную» (и, при необходимости, используя пользовательскую реализацию Resource), но, похоже, мне не нужно было это делать. Это похоже на то, что должно работать из коробки.

1 Ответ

0 голосов
/ 31 августа 2018

Мне кажется, я понял это. Оказывается, я делал что-то немного отличное от того, что, вероятно, делает большинство людей, и есть также (что я считаю) ошибка в Spring Boot, которая проявляется в этом случае.

В частности, я размещал эти ресурсы из WAR, а не из classpath, как кажется, поощряет Spring Boot в наши дни. Тот факт, что длина контента не может быть определена для war: URL-адресов, по моему мнению, является ошибкой в ​​Spring Boot и / или встроенном Tomcat.

Исправление заключалось в простом перемещении видеоресурсов с src/main/webapp/videos/ на src/main/resources/static/videos/ и соответствующем обновлении конфигурации реестра моего обработчика ресурсов (например, addResourceLocations("/videos/") стало addResourceLocations("classpath:/static/videos/")).

Я планирую подать отчет об ошибке в Spring Boot, на который я дам ссылку, когда это сделаю.

Редактировать: Вот отчет об ошибке .

...