当我运行下面的代码时,

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

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

-在桌面应用程序上不会抛出的任何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中。

最佳答案

在小程序中调试您的代码片段,表明传递给URLPermission的参数actions(在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)由应用程序代码设置。


如此看来,当在小程序的上下文中执行某些许可检查时。

10-06 05:30