我一直在開發一個部署在運行Java 6 Update 31的Apache Tomcat 6中的Web應用程序。需要包含一個模塊,該模塊將簡單地偵聽端口X上的傳入TCP流量以供將來處理。在我們開始啓用Java安全管理器(IA安全管理器)之前,一切都很順利。SocketPermission - 客戶端端口?
一旦啓用,我們開始越來越AccessControlExceptions,但這是意料之中的,因爲沒有在我們的政策文件已明確允許該流量。所以,我添加以下行到Tomcat的「catalina.policy裏」文件(其中54321是應用程序所偵聽的端口):
grant {
permission java.net.SocketPermission "*:54321", "accept, resolve";
};
然而,我們仍然看到AccessControlExceptions,如:
java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.1.50:1527 accept,resolve)
望着那錯誤行,我注意到,「192.168.1.50」實際上是客戶端的IP,所以「1527」必須套接字客戶端端口。這是由這個口內的各該嘗試時間變化的事實驗證...
所以,我的問題是:爲什麼我的web應用程序需要關心客戶端?我的理解是,傳出連接只是使用任意/隨機端口。在我看來,在我看來,就這個政策文件而言,我只需要指定我想聽的端口。但是,只有在上述權限行中將「54321」更改爲「*」,才能使此工作起作用,從而將JVM打開到全世界。
我誤解了這裏的語法嗎?如何確保我的應用程序接受來自任何客戶端端口的任何主機在服務器端口54321上的連接?
感謝, 道格
這對我來說是有意義的,除了在Javadoc上爲SocketPermission發現以下內容: '「listen」操作僅在與「localhost」' [(SocketPermission)](http:/ /docs.oracle.com/javase/6/docs/api/java/net/SocketPermission.html) – 2012-04-24 18:36:46
問題是?你想聽遠程服務器上的傳入連接嗎? – jarnbjo 2012-04-25 12:31:49
所以,只是澄清...假設192.168.1.50是遠程客戶端的IP,我會包含兩個SocketPermission行:localhost:54321/listen,192.168.1.50:*/accept? – 2012-04-25 14:55:26