Как ограничить прямой доступа по прямой ссылке в браузере к JSP-странице в Spring?
Пишу на Spring приложение для изучения англ. языка и столкнулся с такой проблемой:
При вводе URL страницы в браузере с результатами тестов она открывается, но нужно, чтобы она была закрыта для просмотра, и открывалась только контроллером после подсчета всех результатов.
Хотел также добавить, что викторина открытая и в ней нет ни админов ни пользователей, доступ имеет любой.
Была идея передавать данные между контроллерами (вроде как код CRC), чтобы построить четкий алгоритм открытия страниц, но как передать данные между котроллерами тоже не нашел.
Смотрел такие варианты как, например, здесь Ограничить прямой доступ к JSP-странице (Spring MVC), но это не мой случай.
Ответы (1 шт):
Чтобы ограничить прямой доступ к JSP-файлам, достаточно их поместить в директорию под WEB-INF
. После этого вы не можете получить прямой доступ к JSP-страние, минуя контроллер.
Вот здесь есть более подробное описание, почему директория WEB-INF
защищает ваши файлы от доступа извне.
Дело в том, что
WEB-INF
— это защищённая директория на сервере, доступ к файлам извне невозможен. Приложение может хранить свои файлы в этой директории, чтобы быть уверенным, которые недоступны для пользователей. Это в первую очередь относится к файлам конфигурации, и другим внутренним файлам. Туда же стали ложить JSP файлы в некоторых MVC фреймворках, чтобы ограничить прямой доступ к View, минуя контроллер.
Вот здесь в Спецификации Сервлетов 6.1 по этому поводу сказано:
В иерархии приложений существует специальный каталог с именем
WEB-INF
. Этот каталог содержит все, что связано с приложением, но не находится в корневом каталоге документов приложения. Большая часть узлаWEB-INF
не является частью общедоступного дерева документов приложения. За исключением статических ресурсов и JSP, упакованных вMETA-INF/resources
файла JAR, который находится в каталогеWEB-INF/lib
, никакие другие файлы, содержащиеся в каталогеWEB-INF
, не могут быть напрямую переданы клиенту контейнером. Однако содержимое каталогаWEB-INF
видимо коду сервлета с помощью вызовов методовgetResource()
иgetResourceAsStream()
вServletContext
и может быть раскрыто с помощью вызововRequestDispatcher
. Следовательно, если разработчику приложения требуется доступ из кода сервлета к специфической для приложения информации о конфигурации, которая не должна быть напрямую раскрыта веб-клиенту, ее можно поместить в этот каталог. Так как запросы сопоставляются с сопоставлениями ресурсов с учетом регистра, клиентские запросы, например, для/WEB-INF/foo
,/WEb-iNf/foo
не должны приводить к возврату содержимого веб-приложения, расположенного в/WEB-INF
, или какой-либо формы его листинга в каталоге.