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
  • Вопрос задан
  • 6062 просмотра
Решения вопроса 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.

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

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

Войти через центр авторизации
Похожие вопросы