2010-10-07 42 views
1

我覺得很愚蠢......JNLP不配合的JFileChooser拒絕訪問

所以我寫一個Java應用程序,如果你能幫助我得到這個工作,你就可以看到它。

所以我的jar文件是在這裏:http://team2648.com/OTIS2/admin/OmniNode2.8.jar

我希望它能夠被用來作爲一個Java Web Start應用程序,我在下面的教程在這裏:http://download.oracle.com/javase/tutorial/deployment/webstart/deploying.html

所以我寫的遵醫囑以下JNLP文件:

<?xml version="1.0" encoding="UTF-8"?> 
<jnlp spec="1.0+" 
codebase="http://team2648.com/OTIS2/admin" 
href="test.jnlp"> 
<information> 
    <title>OmniNode Mapper</title> 
    <vendor>Techplex Engineer</vendor> 
</information> 
<resources> 
    <!-- Application Resources --> 
    <j2se version="1.6+" 
     href="http://java.sun.com/products/autodl/j2se"/> 
    <jar href="OmniNode2.8.jar" main="true" /> 

</resources> 
<application-desc 
    name="OmniNode Mapper" 
    main-class="omninode28.Driver" 
    width="300" 
    height="300"> 
</application-desc> 
<update check="background"/> 
</jnlp> 

但是,如果你下載JNLP http://team2648.com/OTIS2/admin/test.jnlp
並運行它,我們得到以下錯誤(在PC上),你會看到:

access denied (java.io.FilePermission C:\Users\MyUserName\Documents read) 

異常

java.security.AccessControlException:訪問被拒絕(java.io.FilePermission中C:\用戶\ Techplex工程師\文件讀取)
在java.security.AccessControlContext.checkPermission(未知源)
在java.security.AccessController.checkPermission(未知來源)
在java.lang.SecurityManager.checkPermission(未知來源)
在java.lang.SecurityManager.checkRead(未知來源)
在java.io.File.exists(未知來源)
在java.io.Win32FileSystem.canonicalize(未知來源)
在java.io.File.getCanonicalPath(未知來源)
在sun.awt.shell。 Win32ShellFolderManager2.createShellFolder(來源不明)
在sun.awt.shell.Win32ShellFolderManager2.getPersonal(來源不明)
在sun.awt.shell.Win32ShellFolderManager2.get(來源不明)
在sun.awt.shell.ShellFolder。得到(來源不明)
在javax.swing.filechooser.FileSystemView.getDefaultDirectory(來源不明)
與j avax.swing.JFileChooser.setCurrentDirectory(未知來源)
在javax.swing.JFileChooser中(未知來源)
在javax.swing.JFileChooser中(未知來源)
在omninode28.NodePanel(NodePanel.java。: 61)
在omninode28.EditPanel。(EditPanel.java:31)
在omninode28.Driver.main(Driver.java:25)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)
at sun.reflect.NativeMethodAccessorImpl.inv OKE(未知來源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知來源)
在java.lang.reflect.Method.invoke(未知來源)
在com.sun.javaws.Launcher.executeApplication(未知源)
在com.sun.javaws.Launcher.executeMainClass(來源不明)
在com.sun.javaws.Launcher。doLaunchApp(來源不明)
在com.sun.javaws.Launcher.run(來源不明)
在java.lang.Thread.run(來源不明)

所以這些文件它指向:

這一行:fc = new JFileChooser();

所以這讓我相信我需要讓用戶寫入他們的系統的權限。

我很困惑。 任何幫助將超, 謝謝

編輯... 我應該讓用戶直接下載罐子? 優點缺點?

回答

2

你必須簽署的罐子,並通過添加該片段到JNLP權限授予類:

<security> 
    <all-permissions/> 
</security> 
1

顯然,這將是你瀏覽整個要能夠從本地文件系統讀取任何網站一個壞主意,你的罐子沒有簽名。所以它不被直接允許。

也許最好的解決方法是使用FileOpenService。這爲應用程序提供了一個簡單的界面,用於某些描述的文件選擇器,可以在不直接訪問文件系統的情況下打開(讀取並不幸寫入)用戶選擇的文件。

+1

的FileOpenService只允許應用程序讀取文件。這是FileSaveService,迎合寫作。這裏是FOS/FSS&FileContents對象的演示。 http://pscode.org/jws/api.html#fs – 2010-10-08 08:17:34

+1

@Andrew Thompson'FileOpenService'還允許修改所選文件。在文件選擇器之前有一個(無意義的)安全警告對話框,用來表示剛纔讀取的內容。顯示程序員對安全警告的關注程度。 – 2010-10-08 11:54:21

+0

不幸的是,'開放'安全提示已經改變,因爲它現在相當不準確。即使在選中「始終允許」的情況下接受提示,仍然會在用戶保存文件時產生提示。或者至少,這是我目前在PSCode演示中看到的行爲。你能否提供代碼或演示程序的行爲不同? – 2010-10-09 01:27:32