Spring MVC: как разрешить путь к подкаталогам корневой папки JSP в веб-приложении

Что такое простой способ разрешить путь к JSP файлу, который не находится в корневом каталоге JSP веб-приложения с использованием SpringMVCs viewResolvers? Например, предположим, что мы имеем следующую структуру веб-приложения:

web-app
  |-WEB-INF
    |-jsp
      |-secure
        |-admin.jsp
        |-admin2.jsp
      index.jsp
      login.jsp

Я хотел бы использовать некоторые готовые компоненты для разрешения JSP файлов в корневой папке jsp и в безопасном подкаталоге. У меня есть файл *-servlet.xml, который определяет:

из коробки, InternalResourceViewResolver:

 <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
  <property name="prefix" value="/WEB-INF/jsp/"></property>
  <property name="suffix" value=".jsp"></property>
 </bean>

отображение обработчика:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 <property name="mappings">
  <props>
   <prop key="/index.htm">urlFilenameViewController</prop>
   <prop key="/login.htm">urlFilenameViewController</prop>
   <prop key="/secure/**">urlFilenameViewController</prop>
  </props>
 </property>
</bean>

встроенный контроллер UrlFilenameViewController:

<bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
</bean>

Проблема заключается в том, что запросы к JSP в безопасном каталоге не могут быть разрешены, поскольку jspViewResolver имеет только префикс, указанный как /jsp/, а не /jsp/secure/.

Есть ли способ обрабатывать такие подкаталоги? Я бы предпочел сохранить эту структуру, потому что я также пытаюсь использовать Spring Security и иметь все защищенные страницы в подкаталоге - это хороший способ сделать это.

Вероятно, есть простой способ добиться этого, но я новичок в Spring и Spring MVC, поэтому любые указатели будут оценены.

Ответ 1

Я не смог найти точное решение вопроса, который я задал, но у меня есть обходное решение, соответствующее моим особым требованиям. Кажется, что проблема заключается в сопоставлении hander. Если указано в примере в сообщении, любые запросы на страницы в защищенной папке приводят к неудачной попытке найти фактический JSP файл в папке /WEB-INF/JSP/, когда, конечно, фактический файл находится в /WEB-INF/jsp/secure/.

Однако, если указано так:

 <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/login.htm">loginFormController</prop>
    <prop key="**/*.htm">urlFilenameViewController</prop>
   </props>
  </property>
 </bean>

Затем все страницы будут правильно решены. Запрос на /login.html перейдет к определенному контроллеру формы, но запросы на все остальные страницы, независимо от того, находятся они в корневом каталоге JSP или подкаталоге, будут найдены. Для меня это прекрасно, потому что то, что я действительно искал, - это способ избежать указания контроллера на каждую страницу приложения (хм... возможно, я должен был сделать это ясно в первом сообщении), и, возможно, есть лучшие способы сделайте это в любом случае (?)). **/*.htm действует как общий случай, и любые страницы, которые я хочу обработать другим контроллером, могут быть явно указаны выше этого свойства, как показано на рисунке /login.htm.

Ответ 2

Попробуйте с помощью UrlFilenameViewController или return new ModelAndView("secure/login");

Ответ 3

Вы можете попробовать указать имена видов в контроллере, например

<property name="formView" value="secure/admin"/>
<property name="successView" value="secure/admin2"/>

с префиксом и суффиксом, отображаемым ниже

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />

В конечном итоге это будет отображаться в /WEB -INF/jsp/secure/admin.jsp и/WEB-INF/jsp/secure/admin2.jsp

Ответ 4

Вам нужно установить для свойства alwaysUseFullPath в обработчике значение true:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    ...
    <property name="alwaysUseFullPath" value="true" />
</bean>

Это заставит обработчик использовать часть '/secure/' URI, а затем распознаватель будет включать ее при поиске JSP в WEB-INF/jsp.

Ответ 5

Кажется, что это должно работать, согласно документам:

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/web/servlet/mvc/UrlFilenameViewController.html

Показанные конфигурации, похоже, совпадают с примерами в документе. Если ваш сервлет-диспетчер Spring MVC сопоставляется с "/", тогда запросы на "{context}/secure/whatever.jsp" должны быть переведены для просмотра имени "безопасно/безотносительно". Может быть, это имеет какое-то отношение к "**" шаблону? Или, может быть, некоторые из ваших других конфигураций неверны? Можете ли вы включить часть вашего web.xml, где вы настроили сервлет диспетчера Spring, а также включить полные пути, которые вы запрашиваете в своем браузере?

Другой способ найти проблему - загрузить исходный код Spring MVC и включить его в ваше приложение, а затем использовать отладчик, чтобы точно увидеть, что происходит в SimpleUrlHandlerMapping и UrlFilenameViewController beans, чтобы попробовать чтобы определить ошибку. Вы должны быть в состоянии довольно быстро определить, где все идет не так.

Ответ 6

Вам нужно установить свойство следующим образом:

<property name="prefix" value="/WEB-INF/jsp/"/>

а затем вы можете получить доступ к URI secure/admin1.jsp

Ответ 7

Доступ ко всем подпапкам осуществляется с помощью wild card in prefix

От контроллера вы можете просто вернуть имя jsp в виде строки, и jsp будет отображаться, даже если он находится в подпапках/WEB-INF/jsp/like/WEB-INF/jsp/abc