我有3个在jetty中运行的java web-apps,我希望其中一个只能通过localhost访问。我不想写过滤器。可以通过修改一些jetty配置来完成吗?
答案 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容器的实例,在不同的端口上运行,并使用防火墙来阻止其中一个端口。