2011-07-04 97 views
3

我有一個與Java Applet安全性有關的問題/問題...
我使用Applet必須從服務器(ASP.NET)獲取文件並從中表示信息。小程序使用的代碼需要的文件:對於Java Applets,http:// localhost:8000 /和http://127.0.0.1:8000/之間的區別是什麼

URL u = new URL(getCodeBase(), filename); 
BufferedReader d = new BufferedReader(new InputStreamReader(u.openStream())); 

出現此代碼在兩個地方:

  1. Init()方法
  2. 一些其他方法Test()是人工呼叫從JavaScript

所以,當我嘗試使用URL http://127.0.0.1:8000/Test.aspx加載Applet的頁面,一切工作正常,我可以從兩個m中讀取文件內容編制方法。但是,如果我改變http://localhost:8000/的URL,只有第一種方法正常工作,我可以得到的文件內容,併爲第二個我得到JavaConsole一個錯誤信息:

java.security.AccessControlException:訪問被拒絕( java.net.SocketPermission 127.0.0.1:8000連接,解析)

在這種情況下有什麼區別?爲什麼'localhost'在這種情況下是不可能的?有沒有辦法像127.0.0.1一樣授予對'localhost'的訪問權限?

這裏是最簡單的小程序的例子:

public class TestApplet extends Applet { 

    public void init() 
    { 
     System.out.println("init..."); 

     readDocument(); 
    } 

    public void readDocument() 
    { 
     System.out.println("read test.txt file..."); 

     URL base = getCodeBase(); 
     String filename = "test.txt"; 
     try { 
      URL u = new URL(base, filename); 
      BufferedReader d = new BufferedReader(new InputStreamReader(u.openStream())); 
      System.out.println(d.readLine()); 
      System.out.println("Done!"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

,並在客戶端使用下面的代碼:

<applet archive="/Content/test.jar" code="test.TestApplet.class" name="testApplet" mayscript></applet> 

<script language="javascript" type="text/javascript"> 
    $(document).ready(function() { 
     var testApplet = document.testApplet; 
     testApplet.readDocument(); 
    }); 
</script> 

此代碼的工作完美,當我嘗試使用http://127.0.0.1:8000/Test.aspx 和不工作的時候我用戶http://localhost:8000/Test.aspx。我java控制檯我看到下一個:

init... 
read test.txt file... 
some text... 
Done! 
read test.txt file... 
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:8000 connect,resolve) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkConnect(Unknown Source) 
    at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.<init>(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at java.net.URL.openStream(Unknown Source) 
    at test.TestApplet.readDocument(TestApplet.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.plugin.javascript.JSInvoke.invoke(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source) 
    at sun.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source) 
    at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source) 
    at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source) 
    at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source) 
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source) 
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source) 
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

P.S .: Applet已簽名。

+0

在您訪問「127.0.0.1」這兩種情況下,我沒有看到你所說的「本地主機」,或與本地主機的一個問題... – woliveirajr

+0

怎樣的JavaScript調用'Test'方法?它如何創建URL?你能確保它使用與Applet在瀏覽器中相同的URL嗎? – sudocode

+0

是...拼寫錯誤...已更改 –

回答

3

問題是來自JavaScript的調用。如果您使用JavaScript來調用您的方法,那麼即使您自己的代碼被簽名,調用的權限也會下降到JavaScript橋的權限(即沒有任何內容)與您自己代碼的權限的交集。

爲了避免這種情況,並使用applet代碼的完整權限,請將安全相關部分放在AccessController.doPrivileged(...)調用中。(當然,你的小程序應該首先檢查這是不是可以做任何惡意的事情)。

但是我不知道爲什麼它可以直接使用IP地址,而不是localhost

+0

非常感謝!有效!!!不幸的是,沒有足夠的聲譽來標記這種迴應是有用的......當有足夠的時候會做。再次感謝! –

+0

@Aleksey:作爲問這個問題的人,你可以*接受你認爲最有用的答案,方法是使用答案旁邊的接受按鈕(此複選標記:✔)。 –

+0

你能提供一些代碼給你的解決方案嗎? –

2

本地主機127.0.0.1所以你可能需要設置/修復它在你的環境的別名。在Windows下,您必須編輯文件C:\ Windows \ System32 \ drivers \ etc \ hosts

+0

我想過它......在主機文件中有「127.0.0.1 localhost」。沒有幫助。 –

+0

在Linux中,/ etc/hosts中 –

+0

@Aleksey我用Google搜索了一下,發現這個http://stackoverflow.com/questions/2612895/where-to-place-java-applet-policy-file與此http:// imagej.588099.n2.nabble.com/appletviewer-imageJA-trouble-td5943534.html希望它有助於 – ascanio

0

localhost通常解析爲::1127.0.0.1,OS/libc通常設置爲在這些情況下首選IPv6。

因此,很可能你只允許127.0.0.1而不允許來自::1的IPv6連接。

+0

不能肯定正確理解什麼是你談論......但我在hosts文件中註釋掉接下來的幾行:127.0.0.1本地主機 :: 1本地主機 –

相關問題