检查我们是否在java applet中具有打印权限而不提示用户

时间:2012-07-21 01:06:25

标签: java printing applet certificate

基本上,我有一个自签名(现在)Java applet,可以打印东西。即使我可以在不签署applet的情况下进行打印,但我不想在每次访问我的网站时提示用户。最糟糕的是,它们会为您在PrinterJob对象上执行的每个操作提示。现在,如果他们接受证书,则不会得到任何打印提示,这正是我想要的行为。不幸的是,如果他们拒绝证书,他们必须再次接受打印提示。我想做的是,如果他们拒绝证书就停止applet。为此,我尝试了以下方法:

public void init(){ 
    doPrivileged(new PrivilegedAction<Void>() {
        @Override
        public Void run() {
            _appsm = System.getSecurityManager();
            if (!hasPrintPermissions()) return null;

            printer = new MarketplaceLabelPrinter();
            LOG.info("Initialized");
            return null;
        }
    });
}

/**
 *  Returns true if the applet has enough permissions to print
 */
public boolean hasPrintPermissions(){
    try{
        _appsm.checkPrintJobAccess();
    } catch (SecurityException e) {
        LOG.severe("Not enough priviledges to print.");
        return false;
    }
    return true;
}

这确实有点工作,但它提示用户,我不想要。更糟糕的是,这种安全检查完全没用,因为如果他们按OK但不检查“始终允许此applet访问打印机”,安全检查认为它可以访问打印机,但实际上它没有。 (见:http://i.imgur.com/541YW.png

总之,如果用户拒绝证书,我希望applet停止运行。

谢谢大家

1 个答案:

答案 0 :(得分:2)

对不受信任的applet中不允许的内容进行try / catch。伪代码,例如

public static boolean isTrusted() {
  boolean trusted = false;
  try {
    SecurityManager sm = System.getSecurityManager();
    // not permitted in a sand-boxed app.
    System.setSecurityManager(null);
    // restore the trusted security manager.
    System.setSecurityManager(sm);
    // This code must be trusted, to reach here.
    trusted = true;
  catch(Throwable ignore) {}
  return trusted;
}