Вы оставили много информации:
- Используется ли сервлет только вашим EJB-модулем или другими клиентами?
- Работают ли сервлет и модуль EJB в одном и том же контейнере? Это же физическая машина?
- Какой веб-сервер / контейнер сервлетов / J2EE-контейнер вы используете?
Если сервлет используется только модулем EJB, и они оба находятся на одном компьютере, вы можете просто настроить свой веб-контейнер так, чтобы он принимал соединения только от localhost
, и изменить URL-адрес, используемый вашим модулем EJB для указания localhost
вместо имени публичного домена или IP-адреса.
Если они находятся на разных машинах, или если ваш сервлет используется другими клиентами, то вам нужно будет как-то аутентифицировать модуль EJB. Вы можете использовать клиентские сертификаты SSL (см. этот вопрос ) или настроить свой контейнер сервлетов для разрешения соединений с IP-адреса модуля EJB.
EDIT
Использование фильтра сервлетов для управления доступом довольно просто. В вашем случае вы хотите убедиться, что запрос исходит от localhost. Если нет, отправьте неавторизованное сообщение обратно клиенту.
Вот очень простая реализация метода doFilter
, которая должна это сделать:
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws ServletException, IOException
{
if (!request.getRemoteAddr().equals("127.0.0.1")) {
HttpServletResponse rsp = (HttpServletResponse) response;
rsp.sendError(HttpServletResponse.SC_FORBIDDEN, "You are not authorized to access this resource.");
}
chain.doFilter(request, response);
}
Добавьте фильтр к вашему web.xml
примерно так:
<filter>
<filter-name>AuthorizationFilter</filter-name>
<filter-class>com.foo.bar.AuthorizationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthorizationFilter</filter-name>
<servlet-name>RestrictedServlet</servlet-name>
</filter-mapping>
Фильтры выполняются в том порядке, в котором они отображаются в web.xml
, поэтому убедитесь, что фильтр авторизации является первым в списке.
Сказав все это, я согласен с BalusC здесь. Если это вообще возможно, вам следует реорганизовать свой код, чтобы модуль EJB выполнял код напрямую, а не с помощью вызова сервлета.