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