Ограничить доступ к веб-приложению кроме localhost - PullRequest
2 голосов
/ 15 мая 2010

У меня есть 3 java-приложения, работающие на пристани, и я хочу, чтобы одно из них было доступно только через localhost. Я не хочу писать фильтр. Можно ли это сделать, изменив конфигурацию причала?

Ответы [ 3 ]

2 голосов
/ 15 мая 2010

Абсолютно простое решение - привязать сокет вашего сервера только к localhost. Установка параметра host вашего разъема на localhost должна сделать эту работу. Обратите внимание, что это работает только для localhost, это заставит Jetty прослушивать только через интерфейс обратной связи.

2 голосов
/ 15 мая 2010

Игра с виртуальными хостами

Чтобы сделать это по конфигурации, вы можете использовать виртуальные хосты. С документация :

Предположим, у нас есть еще одно веб-приложение, zzz.war. Мы хотим, чтобы xxx.war был развернут, как указано выше, и zzz.war будет развернуто только с 777.888.888.111, www.other.com, www.other.net и www.other.org:

<!-- webapp xxx.war -->
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
  <Set name="contextPath">/xxx</Set>
  <Set name="war"><SystemProperty name="jetty.home"/>/webapps/xxx.war</Set>
  <Set name="virtualHosts">
    <Array type="java.lang.String">
      <Item>333.444.555.666</Item>
      <Item>127.0.0.1</Item>
      <Item>www.blah.com</Item>
      <Item>www.blah.net</Item>
      <Item>www.blah.org</Item>
    </Array>
  </Set>
</Configure>

<!-- webapp zzz.war -->
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
  <Set name="contextPath">/zzz</Set>
  <Set name="war"><SystemProperty name="jetty.home"/>/webapps/zzz.war</Set>
  <Set name="virtualHosts">
    <Array type="java.lang.String">
      <Item>777.888.888.111</Item>
      <Item>www.other.com</Item>
      <Item>www.other.net</Item>
      <Item>www.other.org</Item>
    </Array>
  </Set>
</Configure>

Таким образом, можно представить, что одно веб-приложение «развернуто» на локальном IP-адресе 127.0.0.1, а другое - на именах, соответствующих сетевому IP-адресу.

Игра с разъемами

Другим вариантом будет определение двух соединителей и привязка Jetty к только для localhost для одного из них. В вашем jetty.xml

<Configure class="org.mortbay.jetty.Server">

    <!-- set up both connectors -->
    <Set name="connectors">
      <Array type="org.mortbay.jetty.Connector">
        <Item>
          <New  class="org.mortbay.jetty.nio.SelectChannelConnector">
            <Set name="host"><SystemProperty name="jetty.host" default="localhost"/></Set>
            <Set name="port">8080</Set>
            <Set name="maxIdleTime">30000</Set>
            <Set name="Acceptors">1</Set>
            <Set name="name">connA</Set>
          </New>
        </Item>
        <Item>
          <New id="connB" class="org.mortbay.jetty.nio.SelectChannelConnector">
            <Set name="host"><SystemProperty name="jetty.host" default="0.0.0.0"/></Set>
            <Set name="port">9090</Set>
            <Set name="maxIdleTime">30000</Set>
            <Set name="Acceptors">1</Set>            
            <Set name="name">connB</Set>
          </New>
        </Item>
      </Array>
    </Set>

</Configure>

А затем «назначьте» ваше веб-приложение выбранному соединителю. Например, в contextA.xml:

<Configure  class="org.mortbay.jetty.webapp.WebAppContext">      
  <Set name="war"><SystemProperty name="jetty.home"/>/webapps/A</Set>
  <Set name="contextPath">/webappA</Set>
  <Set name="connectorNames">
    <Array type="String">
      <Item>connA</Item>
    </Array>
   </Set>
  ...
</Configure>

Но, как вы можете видеть, наличие разных разъемов подразумевает прослушивание на разных портах (если у вас несколько сетевых адаптеров).

См. Также

0 голосов
/ 15 мая 2010

Написание фильтра - это портативное решение, простое в настройке и использовании. Было бы только request.getRequestURL(), чтобы проверить, является ли это localhost

В этой теме вы можете увидеть возможность использовать apache в качестве внешнего интерфейса.

Другой вариант - просто использовать экземпляры сервлет-контейнера, работающие на разных портах, и использовать брандмауэр для блокировки одного из портов.

...