[英]java.security.AccessControlException in applet communicating with mysql
[英]Java applet java.security.AccessControlException
我正在开发一个打印文件的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)!
看起来问题是:
所以小程序被阻止了。 我们必须使用
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;
}
}
你可能得到了这个:
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 applet 必须连接到该地址 - 该地址与localhost
不同, localhost
的地址为127.0.0.1
。
这只会处理Socket Permission错误。 但是,如果您尝试访问用户的硬件,您可能会遇到其他问题。 在这种情况下,您需要制作证书,用户将选择是否运行您的小程序。
如果您只想在家用计算机上运行此程序,则需要在主目录中使用纯文本java.policy
文件。 (〜/ .java.policy for Unix people。)在该文件中,您将键入:
grant{
permission java.security.AllPermission;
};
将此文件保存在主目录中后, 所有 Java小程序都将获得运行任何内容的完全权限。 它就像SecurityManager不存在一样,所以尽量小心一点。 完成测试后,我建议删除此文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.