2010-02-17 27 views
1

我在使用JWS(Java Web Start)訪問文件時遇到了一些問題。該程序添加了一個新的標籤和圖像。該程序在我的本地計算機上運行良好,但是當我使用JWS在遠程服務器上運行程序時,出現錯誤頁面。以下是錯誤的示例:java.security.AccessControlException:拒絕訪問使用Java Web開始

Exception in thread "AWT-EventQueue-0" java.security.AccessControlException: access denied (java.io.FilePermission add2.png read) 
at java.security.AccessControlContext.checkPermission(Unknown Source) 
at java.security.AccessController.checkPermission(Unknown Source) 
at java.lang.SecurityManager.checkPermission(Unknown Source) 

即使在確保圖像具有讀取權限後,仍會發生這種情況。

想法?

回答

2

add2.png在哪裏?如果它位於本地文件系統上(與具有.jnlp文件的服務器相反),那麼這是不允許的,以保護用戶的隱私。另外,從另一個Web服務器獲取資源也是不允許的。

請記住,JWS和小程序代碼通常是不可信的(除非它已被數字簽名並被用戶接受)。因此,應用於它們的默認權限必須相當嚴格。


編輯補充:這似乎從你的程序仍試圖讀取本地文件,而不是使用URL到遠程服務器的堆棧跟蹤。確保你的代碼沒有提及java.io.File;這將幫助您查明任何有問題的代碼區域。

+0

我已將其上傳到服務器。 – Miamian 2010-02-17 00:29:01

+2

同一臺服務器?或者是另一個?另外,如果您還沒有這樣做,請從您的代碼中刪除所有提及的「File」。 – 2010-02-17 00:30:01

4

applet類似,JNLP(在webstart)運行在客戶機上,而不是在服務器計算機。客戶端從網頁下載程序並在本地機器上運行。在java.io的東西中的任何引用都將指向本地磁盤文件系統(代碼運行的地方),而不是遠程磁盤文件系統(其中代碼已從其下載),正如您所期望的那樣。

你有2種選擇:

  1. 包圖像中的JAR和使用ClassLoader#getResourceAsStream()而是從中獲得InputStream

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    BufferedImage image = ImageIO.read(classLoader.getResourceAsStream("add2.png")); 
    
  2. 把圖像在公共場所的網絡服務器,這樣就可以通過URL訪問它(只有一點點比在類路徑中有慢)。

    BufferedImage image = ImageIO.read(new URL("http://example.com/add2.png")); 
    

也就是說,不顧一切的,使用相對路徑,而不是在java.io東西絕對路徑是一個壞主意。永遠不要這樣做。這將取決於當前的工作目錄,您無法控制該目錄。

0

面臨類似問題。

通過從控制面板中刪除臨時Internet文件來解決 - > Java

相關問題