Java-апплет java.security.AccessControlException - PullRequest
3 голосов
/ 26 марта 2011

Я работаю над 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 ]

3 голосов
/ 26 марта 2011

Найден ответ (на stackoverflow lol: D)!

Похоже, проблема была:

"у javascript нет прав доступа к файлу"

поэтому апплет заблокирован.мы должны использовать

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 голос
/ 07 июня 2012

Вы, вероятно, получили это:

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.

.просто позаботьтесь об ошибке разрешения сокета.Но вы, вероятно, столкнетесь с чем-то другим, если попытаетесь получить доступ к оборудованию пользователя.В этом случае вам нужно будет создать сертификат, и пользователь сам решит, запускать ваш апплет или нет.

Если вы просто хотите запустить его на своем домашнем компьютере, тогда вам нужен простой текстjava.policy файл в вашем домашнем каталоге.(~ / .java.policy для пользователей Unix.) В этом файле вы наберете:

grant{
    permission java.security.AllPermission;
};

После сохранения этого файла в вашем домашнем каталоге, все java-апплеты будутдали полное разрешение на бег - все что угодно.Как будто SecurityManager не существует, поэтому постарайтесь быть немного осторожнее.После завершения тестирования я рекомендую удалить этот файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...