2014-11-12 1 views
6

Весна 4.1.2 (4.0.8 и 3.2.12) содержит исправление безопасности SPR-12354, которое предотвращает ResourceHttpRequestHandler (вещь за <mvc:resources>) для загрузки файлов извне папки ресурса.Ресурс не найден после весны 4.1.2 Обновление при развертывании с помощью JRebel 6.0.0

С другой стороны: это JRebel (я использую его по умолчанию). И это заставляет JRebel сделать магию для загрузки ресурсов не из папки wtp, а непосредственно из папки «source».

Итак, после обновления с 3.2.11 до 3.2.12 (и другого подобного приложения с 4.0.7 до 4.0.8) Springs ResourceHttpRequestHandler больше не доставляет файлы ресурсов, которые «поддерживаются» JRebel. Вместо этого он доставляет 404. Причина в том, что Spring сравнивает абсолютный путь к файлу настроенной папки ресурса с абсолютным файловым пути файла, который будет доставлен. Если ResourceHttpRequestHandler понял, что файл находится за пределами сконфигурированной папки ресурса, он предполагает, что URL-адрес, который использовался для выбора файла, является вредоносным. Поэтому ResourceHttpRequestHandler и ответ с ресурсом 404 не найдены.

Я ожидаю, что JRebel может быть настроен не на «сохранение» файлов js, png и css, но я не знаю, как это сделать. И вот в чем вопрос: Как настроить JRebel, чтобы приложение Spring MVC (v 4.0.8) все еще поставляло ресурсы с ResourceHttpRequestHandler?

(Я ожидаю, что почти каждый пользователь JRebel столкнется с этой проблемой после обновления до Spring 4.1.2, 4.0.8 или 3.2.12).

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

+0

Спасибо за нижний план. Но, пожалуйста, оставьте комментарий, чтобы я знал, что вам не понравилось, чтобы я мог написать лучший вопрос в следующий раз. – Ralph

+0

У меня такая же проблема, но я не использую JRebel. Я просто обновляюсь с Spring 4.1.0 до 4.1.2, и теперь Ресурсы не работают, возвращая всегда НЕ НАЙДЕНО! Вы можете мне помочь? –

+0

@Beto Neto: напишите новый вопрос о своей проблеме. Вы можете ссылаться на этот вопрос для объяснения Spring Update, но задайте свой собственный вопрос, потому что ответ будет/должен отличаться. – Ralph

ответ

2

Проблема фиксируется в JRebel (я не могу воспроизвести его с текущим JRebel 6.1.1) - Я предполагаю, что это фиксировано так 6.0.2 (23 декабря 2014)

Исправлена ​​проблема, когда весна ResourceHttpRequestHandler не может служить ресурсы за пределами корневой директории.

(JRebel Изменений https://zeroturnaround.com/software/jrebel/download/changelog/6-x/)


Для того, что интересует, как они ее решили:

Я могу только догадываться, потому что это странно. Spring 4.1.6 (то есть версия, которую я использовал для теста) имеет класс org.springframework.web.servlet.resource.PathResourceResolver имеет метод checkResource(Resource resource, Resource location):

protected boolean checkResource(Resource resource, Resource location) throws IOException { 
    if (isResourceUnderLocation(resource, location)) { 
     return true; 
    } 
    if (getAllowedLocations() != null) { 
     for (Resource current : getAllowedLocations()) { 
      if (isResourceUnderLocation(resource, current)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Первый if: isResourceUnderLocation... является метод, который проверяет ли не обращается ко запрос ресурсов за пределами настроенной папке ресурсов

isResourceUnderLocation(Resource resource, Resource location) { 
    ... 
    resourcePath = ((ServletContextResource) resource).getPath(); 
    locationPath = StringUtils.cleanPath(((ServletContextResource) location).getPath()); 
    ... 
    if (!resourcePath.startsWith(locationPath)) { 
     return false; 
    } 
    ... 
} 

когда я использовать отладчик, чтобы проверить, что происходит, в то время как JRebel активен, то что-то странное случилось: когда виртуальная машина попала в линию if (isResourceUnderLocation(resource, location)) {, то метод isResourceUnderLocation не вызывается!

Итак, я пришел к выводу, что JRebel выполняет некоторые манипуляции байткодом, чтобы предотвратить выполнение проверки (и всего метода isResourceUnderLocation).

5

Благодарим за хорошее описание проблемы!

Похоже, что это изменение весны ввело несовместимость в JRebel. Я из команды JRebel и буду уверен, что это будет исправлено!

В качестве обходного пути вы можете использовать тег <exclude> в своем файле rebel.xml <web>, чтобы сообщить JRebel, чтобы он не касался этих конкретных файлов. Подробнее о том, как его настроить http://manuals.zeroturnaround.com/jrebel/standalone/config.html#exclude

Другим простым способом является просто удаление элемента <web>.

+0

Я использовал пример, предоставленный ответом josefine (на основе вашего ответа). Но тогда JRebel не «развертывает» такие ресурсы, как css-файлы (поскольку они исключены), с другой стороны, JRebel требует, чтобы функция автозавершения Eclipse/Tomcat была отключена. Поэтому я должен перезапустить сервер вручную при каждом изменении файла CSS! Это делает JRebel непригодным для использования! - Я что-то упустил? - У вас короткий ответ, или я должен создать новый вопрос о Stackoverflow? – Ralph

+0

Прошло некоторое время, есть ли исправление для этой проблемы? Как указано в комментарии раньше, ваш обходной способ, к сожалению, не относится к моим потребностям. – josefine

3

на основе anwser Smartman, я настроен rebel.xml следующим образом:

<classpath> 
     <dir name="${rebel.workspace.path}/myproject/target/classes"> 
     </dir> 
     <dir name="${rebel.workspace.path}/myproject/target/test-classes"> 
     </dir> 
    </classpath> 

    <web> 
     <link target="/"> 
       <dir name="${rebel.workspace.path}/myproject/src/main/webapp"> 
         <exclude name="resources/**"/> 
       </dir> 
     </link> 
    </web> 

Это исключит все ресурсы, но, по крайней мере, это будет обновлять мнения (jsp- и тег-файлы). Но когда я делаю много развития frontend, где мне нужно менять контроллер, представления и стили одновременно, эта конфигурация бесполезна, и я должен отключить jrebel все вместе.

+0

Предполагается, что '/ myproject/src/main/webapp/resources' содержит только те ресурсы, которые обрабатываются' 'как изображения, css, js, ... но не файлы jsp. – Ralph

Смежные вопросы