jre8中URLPermission的IllegalArgumentException

时间:2014-10-20 12:52:32

标签: java applet httpurlconnection japplet illegalargumentexception

当我运行下面的代码时,

- 在JRE8上的一个Applet上,在 con.getInputStream()行引发异常

- 在JRE7或JRE6上的小程序它不会抛出。

- 在任何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)

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

您知道JRE8上导致此异常的原因吗?以及为什么只在applet而不是desktopapp。

1 个答案:

答案 0 :(得分:3)

调试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测试运行不会引发此异常,因为不会调用URLPermition类。是否调用它取决于运行应用程序的上下文。

  

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

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