Restlet框架:如何仅绑定到localhost?

时间:2015-09-03 02:56:50

标签: java localhost bind restlet restlet-2.3.1

我需要构建一个(独立的)基于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?

2 个答案:

答案 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