【问题标题】:Java applet java.security.AccessControlExceptionJava 小程序 java.security.AccessControlException
【发布时间】:2011-03-26 00:38:25
【问题描述】:

我正在开发一个打印文件的 Java 小程序。 小程序是“自签名”的。

打印功能是:

//argFilePath : path to file (http://localhost/Teste/pdf1.pdf)
//argPrintService : something like PrintServiceLookup.lookupDefaultPrintService()
private int print(String argFilePath, PrintService argPrintService){
    try 
    {   

        DocPrintJob printJob = argPrintService.createPrintJob();
        Doc doc;
        DocAttributeSet docAttrSet = new HashDocAttributeSet();
        PrintRequestAttributeSet printReqAttr = new HashPrintRequestAttributeSet();


            URL url = new URL(argFilePath);
            doc = new SimpleDoc(url.openStream(), DocFlavor.INPUT_STREAM.AUTOSENSE, docAttrSet);


            printJob.print(doc, printReqAttr);



    } catch (Exception e) {
        System.out.println(e);
        return 1;
    }

    return 0;
}

尝试打开文件时出现此异常:

java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:80 connect,resolve)

HTML/JavaScrip

<input onclick="alert(document.getElementById('xpto').print('http://localhost/Teste/pdf1.pdf'));" type="button"/>

 <applet width="180" height="120" code="printers.class" id="xpto" archive="printerAPI.jar"></applet>

使用正确:

DocFlavor.INPUT_STREAM.AUTOSENSE

这个想法似乎是打印尽可能多的文件类型 - pdf、docx、jpg 等。

如何解决这个异常?

【问题讨论】:

    标签: java security sockets applet


    【解决方案1】:

    找到答案(在 stackoverflow 上大声笑:D)!

    看起来问题是:

    "javascript does not have file access permissions"

    所以小程序被阻止了。我们必须使用

    AccessController.doPrivileged()
    

    doPrivileged

    这是我的实现:

    private int print(String argFilePath, PrintService argPrintService){
            cPrint cP = new cPrint(argFilePath, argPrintService);
            return  (Integer) AccessController.doPrivileged(cP);
        }
    
    class cPrint implements PrivilegedAction<Object> {
        String FilePath;
        PrintService PrintService;
    
        public cPrint(String argFilePath, PrintService argPrintService) {
    
            this.FilePath = argFilePath;
            this.PrintService = argPrintService;
    
        };
        public Object run() {
            // privileged code goes here
    
            try 
            {   
    
                DocPrintJob printJob = PrintService.createPrintJob();
                Doc doc;
                DocAttributeSet docAttrSet = new HashDocAttributeSet();
                PrintRequestAttributeSet printReqAttr = new HashPrintRequestAttributeSet();
    
    
    
                    URL url = new URL(FilePath);
                    doc = new SimpleDoc(url.openStream(), DocFlavor.INPUT_STREAM.AUTOSENSE, docAttrSet);
    
                    printJob.print(doc, printReqAttr);
    
    
    
            } catch (Exception e) {
                System.out.println(e);
                return 1;
            }
    
            return 0;
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可能明白了:

      java.security.AccessControlException: access denied (java.net.SocketPermission
      127.0.0.1:80 connect,resolve)
      

      因为小程序无法连接到网站,除了它们来自的网站。现在,这非常愚蠢,因为人们会认为localhost 不是另一个网站,但 Java SecurityManager 必须只查看 IP 地址。因此,如果浏览器连接到74.125.224.224,那么Java 小程序必须连接到那个地址——这与localhost 不同,它的地址是127.0.0.1

      这只会处理 Socket Permission 错误。但是,如果您尝试访问用户的硬件,您可能会遇到其他问题。在这种情况下,您需要制作证书,用户将选择是否运行您的小程序。

      如果你只是想在你的家庭计算机上运行它,你需要一个纯文本的java.policy 文件在你的主目录中。 (~/.java.policy 适用于 Unix 用户。)在该文件中,您将键入:

      grant{
          permission java.security.AllPermission;
      };
      

      将此文件保存到主目录后,所有 java applet 将被授予运行的完全权限——任何东西。就像 SecurityManager 不存在一样,所以要小心一点。完成测试后,我建议您删除此文件。

      【讨论】:

        猜你喜欢
        • 2012-08-26
        • 2014-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多