Java applet java.security.AccessControlException

时间:2011-03-26 00:38:26

标签: java security sockets applet

我正在开发一个打印文件的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等。

如何修复异常?

2 个答案:

答案 0 :(得分:3)

找到答案(在stackoverflow上lol:D)!

看起来问题是:

"javascript does not have file access permissions"

所以applet被阻止了。我们必须使用

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

答案 1 :(得分:1)

你可能得到了这个:

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

因为applet无法与网站建立连接,而不是来自网站的网站。现在,这非常愚蠢,因为人们会认为localhost不是另一个网站,但Java SecurityManager必须只查看IP地址。因此,如果浏览器已连接到74.125.224.224,则Java小程序必须连接到该地址 - 该地址与localhost不同,其地址为127.0.0.1。< / p>

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

如果您只想在家用计算机上运行此功能,则需要在主目录中使用纯文本java.policy文件。 (〜/ .java.policy适用于Unix用户。)在该文件中,您将键入:

grant{
    permission java.security.AllPermission;
};

将此文件保存在主目录中后,所有 java applet将获得运行任何内容的完全权限。它就像SecurityManager不存在一样,所以尽量小心一点。完成测试后,我建议删除此文件。