我需要构建一个(独立的)基于restlet的服务,只能侦听localhost ,即不允许来自网络的请求。
我试图做那显而易见的事情:
Server srv = new Server(Protocol.HTTPS, "localhost", httpsPort);
component.getServers().add(srv);
但该服务仍然在监听0.0.0.0。 : - (
我进入代码后发现HttpsServerHelper在创建服务时忽略了主机名:
this.server = HttpsServer.create(new InetSocketAddress(getHelped().getPort()), 0);
普通HTTP的HttpServerHelper中存在类似的代码,它更加清晰。
我的问题是:
如何将Restlet组件/服务配置为仅侦听localhost?
答案 0 :(得分:2)
我不知道您在独立的Restlet应用程序中使用哪个服务器。您应该使用默认服务器以外的服务器连接器,我建议您使用Jetty连接器。
要做到这一点,只需将扩展名org.restlet.ext.jetty
的jar放入类路径中。
在这种情况下,使用以下代码应符合您的需求:
component.getServers().add(Protocol.HTTP, "localhost", 8182);
以下是应用程序启动时的相应跟踪:
2015-09-03 09:47:22.180:INFO::jetty-7.1.6.v20100715
2015-09-03 09:47:22.211:INFO::Started SelectChannelConnector@localhost:8182
此外,以下是有关Restlet连接器的Restlet文档中的链接:http://restlet.com/technical-resources/restlet-framework/guide/2.3/core/base/connectors。
希望它可以帮到你, 亨利
答案 1 :(得分:2)
实现这一目标的更简单方法是使用虚拟主机。 虚拟主机是处理请求时的第一个路由屏障,尤其是它有助于在域上进行路由。
以下示例代码说明了这一点:
Component c = new Component();
c.getServers().add(Protocol.HTTP, 8182);
VirtualHost host = new VirtualHost();
host.setHostDomain("localhost");
c.getHosts().add(host);
host.attach(new Restlet() {
@Override
public void handle(Request request, Response response) {
response.setEntity("hello, world", MediaType.TEXT_PLAIN);
}
});
c.start();
通常,应用程序附加在组件的默认主机上。除了基于附加应用程序的上下文路径的路由请求之外,此默认主机不执行任何操作:
c.getDefaultHost().attach("/contextPath1", new Test1Application());
c.getDefaultHost().attach("/contextPath2", new Test2Application());
如果您希望根据请求路径以外的其他数据过滤呼叫,则虚拟主机可能就是解决方案。
这是一个可以帮助您的图表:
http://restlet.com/technical-resources/restlet-framework/tutorials/2.3#part05