限制对localhost以外的Web应用程序的访问

时间:2010-05-15 10:27:10

标签: java jetty

我有3个在jetty中运行的java web-apps,我希望其中一个只能通过localhost访问。我不想写过滤器。可以通过修改一些jetty配置来完成吗?

3 个答案:

答案 0 :(得分:2)

绝对最简单的解决方案是仅将服务器套接字绑定到localhost。将连接器的host参数设置为localhost应该可以正常工作。请注意,这仅适用于localhost,它将使Jetty仅在环回接口上侦听。

答案 1 :(得分:2)

使用虚拟主机

要通过配置执行此操作,您可以使用虚拟主机。来自the documentation

  

假设我们还有另一个webapp,   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>

因此,我们可以想象将一个webapp“部署”在本地127.0.0.1 IP地址上,另一个部署在与网络IP地址对应的名称上。

使用连接器

另一种选择是定义两个连接器并将 localhost only 上的Jetty绑定到其中一个连接器。在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>

然后将您的webapp“分配”到所选的连接器。例如,在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>

但正如您所看到的,使用不同的连接器意味着侦听不同的端口(除非您有多个NIC)。

另请参阅

答案 2 :(得分:0)

编写过滤器是便携式解决方案,易于配置和使用。它只有request.getRequestURL()来检查它是否为localhost

In this thread您可以看到使用apache作为前端的选项。

另一种选择是只需要servlet容器的实例,在不同的端口上运行,并使用防火墙来阻止其中一个端口。