我需要做的是运行一个Java应用程序,该应用程序是Restlet提供的一个RESTful服务服务器端书写器。此服务将由另一个在Google App Engine上运行的应用程序调用。在Ubuntu上使用Java应用程序打开端口80
由于GAE的限制,每个http调用都被限制到带有HttpUrlConnection类的端口80和443(http和https)。因此,我必须在端口80或443上部署我的服务器端应用程序。
但是,由于该应用程序在Ubuntu上运行,并且1024以下的端口不能被非root用户访问,因此拒绝访问当我运行我的应用程序时会抛出异常。
已进入我脑海的解决方案包括:
更改JRE,这是文件驻留在/lib/security/java.policy,以grantjava.net.SocketPermission的安全策略“ * .80“”listen,connect,accept,resolve“权限。但是,既不使用命令行来包含此文件,也不覆盖JRE的java.policy文件中的内容,同样的异常不断出现。
尝试以root用户身份登录,但由于我不熟悉Unix,我不知道该怎么做。
另一种解决办法我还没有尝试是将所有来电映射为80至1234更高的端口,然后我可以在1234部署我的应用程序没有问题,和GAE呼叫发送请求到端口80,但如何连接缺失的差距仍然是一个问题。
目前我使用的是“黑客”的方法,也就是将应用程序打包成一个jar文件,并运行须藤用root权限的jar文件。它现在可以工作,但绝对不适合真正的部署环境。
所以,如果任何人有任何关于解决方案的想法,非常感谢!
在Ubuntu上,你可以通过运行sudo -i来登录,这会给你一个临时的,如果不是理想的解决方案。 – 2010-03-15 01:46:15
实际上,需要在<1024端口上侦听的服务通常首先以root身份启动以获得必要的权限。但是,在打开端口后,他们通过执行一些Unix特定的系统调用将他们的用户ID更改为权限较低的用户。 Java不支持它,因为它必须独立于平台。然而,还有一些第三方库可以让你以可移植性为代价访问Unix/Linux系统API。如果您对此主题感兴趣,请查找“POSIX”和“Java”。 使用iptables转发当然是最好也是最简单的解决方案。 – 2010-03-15 03:48:06
@ the-banana-king感谢您的提示,而且这真的很有帮助,因为我从来没有想过要从Java库中进行操作来处理unix系统。 – 2012-03-15 06:54:28