Задать вопрос

JSP/Servlets: Как запретить вызов определенных сервлетов пользователями?

У меня есть набор сервлетов, каждый из которых имеет mapping.

Ну, то есть для каждого из них прописана вот такая последовательность в web.xml:




<servlet>
<servlet-name>someActivity</servlet-name>
<servlet-class>com.example.servlet.SomeActivity</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>someActivity</servlet-name>
<url-pattern>/etc/some_activity</url-pattern>
</servlet-mapping>


Мне нужно исключить возможность вызова этих сервлетов пользователями, предоставив эту возможность только другим сервлетам (они их используют посредством include/forward).

Как это можно реализовать?



В сервлет-контейнере есть прекрасный механизм с ролями. С теми, что прописываются в tomcat-users.xml

Но, насколько мне известно, они используется в основном только когда реализована аутентификация средствами сервлет-контенера(BASIC, FORM). Однако у меня не используется аутентификация средствами сервлет-контенера…



Можно ли использовать этот механизм ролей для решения указанного выше вопроса?

Как это будет выглядеть?





UPD: Например, вот так это можно сделать:




<security-constraint>
<display-name>Restrict Access</display-name>
<web-resource-collection>
<web-resource-name>include_only_servlets</web-resource-name>
<url-pattern>/etc/*</url-pattern>
</web-resource-collection>
<auth-constraint/>
</security-constraint>


При попытке обратиться к ним -> 403 Forbidden



UPD2: Но лучше всего это сделать вот так:




<servlet-mapping>
<servlet-name>someActivity</servlet-name>
<url-pattern>/WEB-INF/some_activity</url-pattern>
</servlet-mapping>


Спасибо ZyL
  • Вопрос задан
  • 6100 просмотров
Подписаться 5 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
  • Академия Эдюсон
    Java-разработчик: тариф Базовый
    8 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Java-разработчик + ИИ
    9 месяцев
    Далее
Решения вопроса 1
ZyL
@ZyL
Хм… Никогда не задумывался, но навскидку два варианта:

1. Что будет, если прописать путь к сервлету example.com/WEB-INF/myservet? По логике вещей доступа извне к WEB-INF нет, так что юзер получит отлуп.

2. Проверить IP в вызове сервлета — если это не хост сайта, значит, вызов от клиента, return. Криво, конечно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@paimei
Думаю, задача вполне решаема с помощью фильтров.
Посмотрите сюда или просто в Гугл
Ответ написан
@vQFd4
Подобное нужно делать через фильтры, смотри элемент dispatcher

Use the <dispatcher> subelement of <filter-mapping> in web.xml if you want to configure filters for forward or include targets. This element has four supported values:

INCLUDE: Use this for the filter to be applied to any include targets matching a specified servlet name or with URLs matching a specified pattern.

FORWARD: Use this for the filter to be applied to any forward targets matching a specified servlet name or with URLs matching a specified pattern.

REQUEST: Use this in addition to an INCLUDE or FORWARD setting (one <dispatcher> element for each setting) for the filter to also be applied to direct request targets matching a specified servlet name or with URLs matching a specified pattern. (It is nonsensical to use the REQUEST value only. If you want the filter to apply only to direct requests, there is no need to use the <dispatcher> element.)

ERROR: Use this for the filter to be applied under the error page mechanism.

Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Казань
от 75 000 ₽
ИТРУМ Ростов-на-Дону
от 75 000 ₽
Яндекс Москва
от 180 000 до 350 000 ₽