1
当我运行下面的代码

抛出:IllegalArgumentException在URLPermission在jre8

-in上JRE8一个Applet,就行了con.getInputStream()它抛出异常

-in上JRE7一个Applet或JRE6 它不抛出。

-in任何JRE 上的桌面应用程序不会抛出。

当我删除的行始于setRequestPropery,它不抛出任何JRE例外。

 URLConnection con = new URL(adress).openConnection(); 
     con.setDoOutput(true); 
     con.setDoInput(true); 
     con.setUseCaches(false); 
     con.setRequestProperty("Content-Type", 
       "application/octet-stream"); 
     con.setRequestProperty("pragma:", "no-cache"); 
     PrintStream ps = new PrintStream(con.getOutputStream()); 
     ps.println("Test"); 
     ps.close(); 
     in = new DataInputStream(conn.getInputStream()); 

例外:

java.lang.IllegalArgumentException: invalid actions string 
at java.net.URLPermission.init(Unknown Source) 
at java.net.URLPermission.<init>(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.URLtoSocketPermission(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) 

在我的小程序,我试图打开一个连接,我需要那些请求属性。

你知道是什么原因导致JRE8出现这种异常吗?为什么只在一个applet而不是desktopapp。

+0

您是否试图调用跨域网址? – CuriousMind 2014-10-20 12:55:27

+0

applet在www.x.com上托管,连接地址类似于h ttp:// ip:443(它位于x.com以外的另一台服务器上) – e13420xx 2014-10-20 13:07:25

回答

3

DEBUGIN您的代码段中的一个小程序,显示传递给URLPermission参数actions,其中北京时间新胜利java8,具有价值GET:pragma:根据Javadoc文档这样的说法是不正确的:

的URLPermission的操作字符串是方法 列表和请求标头列表的串联。这些是分别允许的 请求方法和许可 的许可请求标头的列表。这两个列表之间用冒号“:”分隔,每个列表的元素用逗号分隔。一些实例是:

 "POST,GET,DELETE" 
    "GET:X-Foo-Request,X-Bar-Request" 
    "POST,GET:Header1,Header2" 

,并根据在Oracle的jdk8的代码:

int colon = actions.indexOf(':'); 
if (actions.lastIndexOf(':') != colon) { 
    throw new IllegalArgumentException("invalid actions string"); 
} 

上述代码期望一个单一结肠或无。

为了解决您需要在您的通话

con.setRequestProperty("pragma", "no-cache"); 

运行你的代码片段简单JUnit测试不会引发此异常pragma后删除冒号问题,因为不调用URLPermition类。它是否被调用取决于应用程序运行的上下文。

注意。根据使用环境的不同,一些请求方法和头文件可能随时都被允许,而其他请求方法和头文件可能在任何时候都不被允许。例如,HTTP协议处理程序可能会禁止某些标头(如Content-Length)由应用程序代码设置,而不管有效的安全策略是否允许。

因此,看起来,当在applet的上下文中执行一些permition检查。

相关问题