Мне нужно исключить возможность вызова этих сервлетов пользователями, предоставив эту возможность только другим сервлетам (они их используют посредством include/forward).
Как это можно реализовать?
В сервлет-контейнере есть прекрасный механизм с ролями. С теми, что прописываются в tomcat-users.xml
Но, насколько мне известно, они используется в основном только когда реализована аутентификация средствами сервлет-контенера(BASIC, FORM). Однако у меня не используется аутентификация средствами сервлет-контенера…
Можно ли использовать этот механизм ролей для решения указанного выше вопроса?
ZyL — вы гениальны! =)) Есть такая штука, jspc И вот совсем недавно я прекомпилировал ей jsp'шки… В сгенерированном jspc web.xml идут вызовы реальных servlet'ов вместо jsp, ну и mapping, разумеется, тоже прописан. Так вот там mapping jsp'шек которые лежат у меня в /WEB-INF/jspf выглядит в точности так, как у вас в первом случае(что и логично, в принципе) А я совсем забыл про это!..
Сейчас вот только попробовал прописать подобный mapping сервлету — работает!
Для юзеров 404 Not Found, но другими сервлетами инклудится по url-mapping'у легко =)
Незнаю, может быть это и хак, но он ОЧЕНЬ простой и логичный. Это как раз то, что мне нужно
Тоже вариант, да… Но с точки зрения реализации, я считаю, он неправильный. Вот, к примеру, в JSP(коими суть являются те же сервлеты) есть простой способ ограничить доступ пользователй к jsp-шкам, которые включаются в другие — нужно просто поместить их в директорию /WEB-INF/jspf, например, и до них в принципе не смогут добраться пользователи… В моем случае решается аналогичная проблема, только с сервлетами… Использовать для этого фильтр мне кажется совершенно не верно. Должен быть какой-то другой способ, который предоставляет сам сервлет-контейнер, а не выдумывать что-то самому
По-моему фильтр — это как раз и есть способ, который предоставляет контейнер. Фильтры специально предназначены для того, чтобы анализировать запрос перед его отправкой в обработку.
Тут дело то в том, что к этим компонетам в принципе пользователю ход закрыт. Тут даже фильтровать нечего — ни при каких обстоятельствах он не должен иметь возможность их вызвать, эти компонеты.
Фильтр же здесь будет работать как заглушка. Это годится, как временное решение. Костыль, если можно так сказать…
Вот я приведу другой, более эффективный способ и вы сможете его сравнить с вашим…
Можно mapping сервлетов просто не прописывать, а при include/forward использовать вот такой вызов:
В таком случае пользователь в принципе не может вызвать этот сервлет, потому что он не привязан к url.
И до недавнего времени я так и делал везде. Но похоже, спецификации требуют, чтобы у сервлетов был mapping к url Поэтому я ищу другой способ.
Если я вас правильно понял, вы хотите, чтобы сервлеты, имеющие mapping на внешний url по этому самому url'у были бы доступны только для вызовов с локального хоста (либо, как вариант, не доступны вообще, а include делать по имени, как вы описыли выше).
Если это так и разделение идет на уровне параметров запроса (в данном случае — запрашивающий хост), то фильтры — самое то, а роли — это уже более «глубокая» проверка, и здесь не нужна.
Вашу мысль, поясненную аналогией с JSP, я тоже понял, но мне кажется, что вы хотите найти способ сделать из сервлета не-сервлет, а это плохой путь и я сомневаюсь, чтобы контейнер это поддерживал (во всех смыслах).
Я вообще бы url mapping в данном случае не использовал и делал бы как и раньше. Просто я не хочу нарушать спецификации. Должен быть стандартный способ сделать то, что я хочу, уверен.
Так же, я не думаю, что сервлеты по-определению все public accessed… В jsp это не так, значит, и в сервлетах должен быть аналогичный способ (и этот способ не фильтр =) )
С фильтрами же смотрите какая ситуация получается… Я создаю сервлет, имеющий, скажем так, public url. А затем создаю фильтр, который, работая перед сервлетом запрещает к нему ход… Это все равно, что я создаю дверь в стене и ставлю перед ней человека, который не разрешает туда заходить… Лучше же не создавать эту дверь! И я не хочу ее создавать… Я хочу инкапсулировать и оставить public servlets и private servlets(forward/include only), вот и все. В jsp это делается… ну, значит, должен быть и способ сделать тоже самое в servlet'ах
Подобное нужно делать через фильтры, смотри элемент 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.