Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用Java';Javascript中的s Desktop.open方法-拒绝访问java.awt.AWTPermission showWindowwithout警告横幅_Java_Javascript_Security_Applet - Fatal编程技术网

调用Java';Javascript中的s Desktop.open方法-拒绝访问java.awt.AWTPermission showWindowwithout警告横幅

调用Java';Javascript中的s Desktop.open方法-拒绝访问java.awt.AWTPermission showWindowwithout警告横幅,java,javascript,security,applet,Java,Javascript,Security,Applet,我有一个web应用程序,需要能够在客户端计算机上本地打开文件,并能够在编辑后保存文件。web应用程序在服务器上通过WebDAV和FTP共享的文件夹中生成一个文档,该文件夹安装在客户端计算机上 我不能使用file://类型URI,因为它不允许保存回服务器 我打算用一个嵌入在web应用程序中的小型java小程序来解决这个问题,该应用程序处理文件打开,但是我在java中的权限方面遇到了困难。(Java不是我的专业领域)。无论如何,我已将代码缩减为以下内容: localfile.html <htm

我有一个web应用程序,需要能够在客户端计算机上本地打开文件,并能够在编辑后保存文件。web应用程序在服务器上通过WebDAV和FTP共享的文件夹中生成一个文档,该文件夹安装在客户端计算机上

我不能使用file://类型URI,因为它不允许保存回服务器

我打算用一个嵌入在web应用程序中的小型java小程序来解决这个问题,该应用程序处理文件打开,但是我在java中的权限方面遇到了困难。(Java不是我的专业领域)。无论如何,我已将代码缩减为以下内容:

localfile.html

<html>
<body>
  <input id="input" value="Call from Javascript" type="button" onclick="callApplet('/Users/conor/1.txt')">
  <script type='text/javascript'>
  function callApplet(path) {
    applet = document.getElementById('localfile');
    applet.openFile(path);
  }
  </script>
<applet id="localfile" code="localfile.class" archive="localfile.jar"  width="150" height="50"></applet>
</body>
</html>
我已经编译、创建了一个jar文件,并从java源代码对其进行了签名

这将生成一个包含两个按钮的页面——一个Java按钮(用于测试)和一个Javascript按钮。Java按钮按预期运行良好-我可以保存文件等。我想将文件路径传递给小程序,但这确实是我希望使用的Javascript按钮。Javascript one抛出了以下内容:

堆栈跟踪

java.security.AccessControlException: access denied ("java.awt.AWTPermission" "showWindowWithoutWarningBanner")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
at java.security.AccessController.checkPermission(AccessController.java:560)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.awt.Desktop.checkAWTPermission(Desktop.java:239)
at java.awt.Desktop.open(Desktop.java:267)
at localfile.openFile(localfile.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source)
at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source)
at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source)
at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source)
at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source)
at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source)
at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source)
at java.lang.Thread.run(Thread.java:722)
我还尝试将desktop.open调用嵌入到doPrivileged块中,如下所示:

  AccessController.doPrivileged(new PrivilegedAction() {
    public Object run() {
      try {
        desktop.open(ffile);
      } catch(Exception ex) {
        ex.printStackTrace();
      }
      return null;
    }
  });
java.lang.SecurityException: class "localfile$1" does not match trust level of other classes in the same package
但这会引发javascript和java按钮的错误,如下所示:

  AccessController.doPrivileged(new PrivilegedAction() {
    public Object run() {
      try {
        desktop.open(ffile);
      } catch(Exception ex) {
        ex.printStackTrace();
      }
      return null;
    }
  });
java.lang.SecurityException: class "localfile$1" does not match trust level of other classes in the same package

任何帮助都将不胜感激。

让它发挥作用,所以我想我会在这里发布解决方案

当我编译包含doPrivileged调用的java文件时,javac编译器创建了两个文件——localfile.class和localfile$1.class。起初我不确定localfile$1.class是什么,只是假设它是某种临时文件。但是,它是一个类文件,对应于doprilleged块中的匿名类,需要包含在.jar文件中并正确签名

所以不管怎样,html文件和以前一样,最终的java文件如下:

  AccessController.doPrivileged(new PrivilegedAction() {
    public Object run() {
      try {
        desktop.open(ffile);
      } catch(Exception ex) {
        ex.printStackTrace();
      }
      return null;
    }
  });
java.lang.SecurityException: class "localfile$1" does not match trust level of other classes in the same package
localfile.java

import java.applet.*;
import java.awt.*;
import java.util.*;
import java.lang.*;
import java.text.*;
import java.awt.event.*;
import java.io.*;

import java.security.*;

public class localfile extends Applet {
  public localfile() {
    Panel p = new Panel();
    p.add(new Button("Call from Java"));
    add("North",p);
  }
  public void openFile(String path) {
    System.out.println("File: " + path);
    final File ffile = new File(path);
    System.out.println("Got file.");
    if (Desktop.isDesktopSupported()) {
      System.out.println("Desktop is supported.");
      final Desktop desktop = Desktop.getDesktop();
      System.out.println("Got Desktop Handle.");
      try {
        desktop.open(ffile);
      } catch(Exception ex) {
        ex.printStackTrace();
      }
      System.out.println("File Opened.");
    }
  }

  public boolean action(Event evt, Object arg) {
    openFile("/Users/conor/1.txt");
    return true;
  }
}
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.security.*;

public class localfile extends Applet {

private static final long serialVersionUID = 1L;

public localfile() {
  Panel p = new Panel();
  p.add(new Button("Call from Java"));
  add("North",p);
}

public void openFile(String path) {
  System.out.println("File: " + path);
  final File ffile = new File(path);
  System.out.println("Got file.");
  if (Desktop.isDesktopSupported()) {
    System.out.println("Desktop is supported.");
    final Desktop desktop = Desktop.getDesktop();
    System.out.println("Got Desktop Handle.");
    AccessController.doPrivileged(new PrivilegedAction() {
      public Object run() {
        try {
          desktop.open(ffile);
        } catch(Exception ex) {
          ex.printStackTrace();
        }
        return null;
      }
    });
    System.out.println("File Opened.");
  }
}

public boolean action(Event evt, Object arg) {
  openFile("/Users/conor/1.txt");
  return true;
}

}
我还发现,不需要让html文件中的javascript创建小程序并将其插入DOM。我认为@VGR linked to的链接中提到了这一点,但没有它,它对我有效


谢谢大家的帮助

考虑为此使用。它甚至可以被沙盒小程序使用。谢谢你的反馈!我确实需要调用desktop.open()方法,以便打开相关应用程序来处理文件类型。我对文件内容并不感兴趣(反正是在helper小程序中)。小程序不对文件内容进行处理,只是作为一种工具,在客户端桌面上打开给定文件类型的相关应用程序。该系统用于基于web的文档管理顺便说一句,“需要调用desktop.open()”我的问题。我的浏览器中同时出现了几个“小程序权限问题”,我感到困惑。“我也尝试过..doPrivileged block”是的,这将需要它。1) 编辑主代码以显示如何使用它。2) 重建罐子。3) 检查代码库中是否没有“松散”类文件。4) 刷新浏览器中的类缓存并重新加载小程序。安全模型似乎不允许这样做,除非其他Javascript将小程序添加到文档中: