Java 小程序 java.security.AccessControlException

标签 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 等。

如何修复异常?

最佳答案

找到答案(在 stackoverflow 上 lol :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;
    }
}

关于Java 小程序 java.security.AccessControlException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5439568/

相关文章:

java - ResourceBundle同时读取2个Properties文件

security - 头脑 Storm : How to quickly create a honeypot for mass spam?

C::Threads 不一致地打开发送套接字

multithreading - 将 hibernate 与多线程套接字服务器一起使用

java - 将 JSF 项目从 Netbeans 部署到 Tomcat 的问题

java - 是否可以将多个 ORM 配置分配给一个 Java 模型?

linux - Linux下的签名可执行文件

node.js - socket.io/socket.io.js - 未找到。 Node.js、express.js 和 socket.io 应用程序

java - 在Java中定义常量字符串?

objective-c - AuthorizationCreate() 显示的更改授权对话框