Назад | Перейти на главную страницу

Создание виртуального каталога на основе конфигурации в WEB-INF

В веб-приложении я хочу создать «виртуальный каталог», который находится в каталоге WEB-INF. По сути, то, что я пытаюсь достичь, - это тот же эффект, что и создание мягкой ссылки в файловой системе, если приложение было запущено в разорванном виде. Я пытаюсь добиться этого как в (что наиболее важно), так и в веб-логике, а также (в идеальном мире) на пристани.

Мне известны конфигурации виртуальных каталогов, однако они не подходят для моих целей, поскольку я не хочу, чтобы контент обслуживался напрямую через URL-адрес (поэтому он живет в WEB-INF). Я не нашел ничего в документе конфигурации для причала или веб-логики, который, кажется, предоставляет аналогичную концепцию разрешения ресурсов (я пытался добавить «extraClassPath» к причалу, но это не увенчалось успехом). В качестве дополнительного фона приложения используют Spring MVC, а преобразователи представлений указывают на JSP в WEB-INF.

<bean id="myResolverBean"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:viewClass="org.springframework.web.servlet.view.JstlView"
    p:prefix="/WEB-INF/foo/baz/" p:suffix=".jsp" />

После просмотра кода Spring я убежден, что он ничего не делает в отношении загрузки ресурсов, это контейнер (weblogic / jetty), который разрешает пути. Я также пробовал использовать URI файлов, но кажется, что контейнер всегда будет интерпретировать путь относительно корня контекста (т.е. абсолютных путей нет).

Итак, мой вопрос: можно ли для этого добавить какие-либо директивы конфигурации в web.xml, конфигурации сервера или конфигурацию Spring?

Неудивительно, что ответ на этот вопрос в weblogic - это виртуальный каталог. Директива обеспечивает как (что я считаю) стандартное поведение сопоставления URL-адреса с некоторым набором (обычно статических файлов) для обслуживания, но также действует как «виртуальная программная ссылка», когда путь находится в WEB-INF и по-прежнему обеспечивает желаемое поведение - выдачу 404, если вы делаете запрос в браузер для такого URL-адреса (я думаю, что я неправильно настроил что-то в первый раз, когда попробовал это). Таким образом, следующее приведет к желаемому поведению:

<virtual-directory-mapping>
  <local-path>/absolute/path/outside/of/webapp</local-path>
  <url-pattern>/WEB-INF/foo/*</url-pattern>
</virtual-directory-mapping>

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

<Set name="baseResource">
  <New class="org.mortbay.resource.ResourceCollection">
    <Arg>
      <Array type="java.lang.String">
        <Item>/path/to/normal/webapp</Item>
        <Item>/absolute/path/outside/of/webapp</Item>
      </Array>
    </Arg>
  </New>
</Set> 

Уловка для обоих из них заключается в том, что структура каталогов должна быть воссоздана во внешних каталогах (т.е. она должна быть / absolute / path / outside / of / webapp / WEB-INF / foo) для правильной работы, насколько я могу там сказать Невозможно сопоставить один каталог с другим каталогом с произвольным именем.