Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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小程序Java.security.AccessControlException_Java_Security_Sockets_Applet - Fatal编程技术网

Java小程序Java.security.AccessControlException

Java小程序Java.security.AccessControlException,java,security,sockets,applet,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

我正在开发一个打印文件的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>
这个想法似乎是打印尽可能多的文件类型——pdf、docx、jpg等

如何修复异常?

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

问题似乎是:

因此,小程序被阻止。我们必须使用

AccessController.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;
    }
}
private int print(字符串argFilePath,PrintService argPrintService){
cPrint cP=新的cPrint(argFilePath,argPrintService);
返回(整数)AccessController.doPrivileged(cP);
}
类cPrint实现PrivilegedAction{
字符串文件路径;
打印服务打印服务;
公共cPrint(字符串argFilePath,打印服务argPrintService){
this.FilePath=argFilePath;
this.PrintService=argPrintService;
};
公共对象运行(){
//特权代码在这里
尝试
{   
DocPrintJob printJob=PrintService.createPrintJob();
文件;
DocAttributeSet docAttrSet=新的HashDocAttributeSet();
PrintRequestAttributeSet printReqAttr=新的HashPrintRequestAttributeSet();
URL=新URL(文件路径);
doc=new SimpleDoc(url.openStream(),DocFlavor.INPUT\u STREAM.AUTOSENSE,docAttrSet);
printJob.print(doc,printReqAttr);
}捕获(例外e){
系统输出打印ln(e);
返回1;
}
返回0;
}
}
您可能会发现:

java.security.AccessControlException: access denied (java.net.SocketPermission
127.0.0.1:80 connect,resolve)
因为小程序无法连接到网站,除了它们来自的网站。现在,这是非常愚蠢的,因为人们会认为
localhost
不是另一个网站,但Java安全管理器必须只查看IP地址。因此,如果浏览器连接到
74.125.224.224
,则Java小程序必须连接到与
localhost
不同的地址,后者的地址为
127.0.0.1

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

如果您只想在您的家庭计算机上运行这个,那么您需要在主目录中有一个纯文本
java.policy
文件。(~/.java.policy for Unix人员。)在该文件中,您将键入:

grant{
    permission java.security.AllPermission;
};
将此文件保存到主目录后,所有java小程序都将获得运行任何内容的完全权限。这就好像SecurityManager不存在一样,所以要小心一点。完成测试后,我建议删除此文件

grant{
    permission java.security.AllPermission;
};