jre8中URLPermission处的IllegalArgumentException

当我运行下面的代码时,

– 在JRE8上的一个Applet中,在con.getInputStream()行上它抛出exception

– 在JRE7或JRE6上的Applet中它不会抛出。

– 在任何JRE上的桌面应用程序中它不会抛出。

当我删除行以setRequestPropery开头时,它不会在任何JRE上抛出exception。

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.(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.URLtoSocketPermission(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) 

在我的applet中,我试图打开一个连接,我需要这些请求属性。

你知道JRE8上导致这个exception的原因吗? 为什么只在applet而不是desktopapp。

在applet中调试你的代码片段,表明传递给URLPermission的参数actions ,即新的win java8,其值为GET:pragma:根据该参数的javadoc无效:

URLPermission的actions字符串是方法列表和请求标头列表的串联。 这些是允许的请求方法和许可的允许请求标头(分别)的列表。 这两个列表用冒号’:’字符分隔,每个列表的元素用逗号分隔。 一些例子是:

  "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"); } 

上面的代码需要一个冒号或没有冒号。

要解决此问题,您需要在调用pragma后删除冒号

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

将代码段作为简单的junit测试运行不会引发此exception,因为不会调用URLPermition类。 是否调用它取决于运行应用程序的上下文。

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

所以看来,当在applet的上下文中执行一些permition检查时。