Есть ли способ ограничить доступ сервлета к определенному порту?

#java #servlets #port #wildfly #web.xml

#java #сервлеты #порт #wildfly #web.xml

Вопрос:

У меня есть приложение, которое использует два разных порта, 443 и 4443. Другой предназначен для использования приложения (пользовательского интерфейса), а другой — канал управления для некоторых автоматизированных клиентов.

У меня есть несколько разных сервлетов, настроенных в web.xml . Первый предназначен для использования в пользовательском интерфейсе, для пользователей, которые обычно используют приложение через https-443:

 <servlet-mapping>
    <servlet-name>application_ui</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
  

У меня также есть сервлет, отображенный в web.xml который используется только клиентами в порту 4443, пусть этот сервлет будет назван как «client_inlet». Это простая служба прослушивания запросов POST, в которой нет функциональности для пользователей.

 <servlet-mapping>
    <servlet-name>client_inlet</servlet-name>
    <url-pattern>/ClientInlet</url-pattern>
</servlet-mapping>
  

В настоящее время пользователи могут получить доступ к обоим разделам приложения с обоих портов, 443 и 4443.

Чего я хочу добиться, так это того, что часть приложения client_inlet будет доступна только с использованием порта 4443, а весь трафик 443 будет перенаправлен на application_ui

Я хотел бы сделать что-то вроде следующего (не уверен, возможен ли такой синтаксис в web.xml но, по крайней мере, это не работает):

 <servlet-mapping>
    <servlet-name>application_ui</servlet-name>
    <url-pattern>https://*:443/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>client_inlet</servlet-name>
    <url-pattern>https://*:4443/ClientInlet</url-pattern>
</servlet-mapping>
  

Возможен ли сценарий вообще с использованием web.xml конфигурация? Или это должно быть сделано на стороне сервера приложений? Я использую WildFly 8.1.0, есть идеи, как это должно быть сделано там в standalone.xml ?

Комментарии:

1. Это часть конфигурации сервера приложений или контейнера сервлета, а не web.xml

2. Итак, вы в основном говорите, что это должно быть сделано в конфигурации wildfly?

3. Я так думаю, да

4. Почему? Что это изменит в вашей жизни?

5. Я хотел бы ограничить доступ к приложению в брандмауэре, используя IP-белый список (443), по-прежнему пропуская весь трафик через порт 4443. И я не хочу, чтобы приложение можно было использовать через порт 4443.

Ответ №1:

Я не думаю, что вы можете сделать это в конфигурации. Поскольку каждый порт — это отдельный сервер, не так ли? В этом случае вам нужно перенаправление на другое местоположение / сервер, а не перенаправление в том же приложении.

Я не вижу другого способа сделать это в коде или приложении.

Использование javax.servlet.Реализация фильтра кажется идеальной для этой задачи. Вам просто нужно проверить, начинается ли path с «/ ClientInlet», затем перенаправить в другое место или просто продолжить запрос. Я не уверен, что правильно понял подробности о перенаправлении, но что-то, как показано ниже, кажется подходящим:

Код фильтра:

 String path = request.getRequestURI();
if(path.equals("/ClientInlet"))
{//Redirect the client to the new location i.e. the other port
    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    response.setHeader("Location", "https://someserver.com:port/ClientInlet");
} else
{//Just forward the request to the servlet
   filterChain.doFilter(servletRequest, servletResponse);
}