根据 release notes of JRE 7u72 :



调用 javax.smartcardio.Card.disconnect(true) 时,即使我有 JDK 7u79,卡也不会重置。当我将 false 或使用选项 -Dsun.security.smartcardio.invertCardReset=true 传递给 VM 时,一切正常。这怎么可能? JDK 7u79 是否附带旧版本的 JRE?

最佳答案

在我看来,JRE 的行为符合预期。

拥有版本 > 7u72 的 Java 7 JRE,您必须调用 disconnect(false) 进行重置(默认情况下。这可能会被系统属性覆盖,您提到了)。这里的原因是,你必须调用 disconnect(false) 来实际断开连接的错误是很老的和众所周知的,所以很多软件采用并调用 disconnect(false) 来重置。如果 Oracle 在某个小版本/错误修复中改变了这种行为,他们就会为所有软件项目造成安全漏洞,他们通过调用 disconnect(false) 来修复其代码中的这个 JRE/JDK 错误。为此原因:



(这是您从文档中引用的内容的一部分)

如果你有一些 Java 8 JRE,你必须默认调用 disconnect(true) ,可能会被系统属性覆盖。

因此,如果您现在想要创建一些代码,确保您的卡将被重置,这适用于 java 7 和 8(甚至可能更旧和即将推出的版本),您必须评估,您必须提交的内容, IE:

final static boolean TRUE;
static{
    String ven = System.getProperty("java.vendor");
    String ver = System.getProperty("java.runtime.version");
    String r = System.getProperty("sun.security.smartcardio.invertCardReset");
    TRUE=!invertReset(ven, ver, r);
}

static boolean invertReset(String vendor, String version, String reset){
    if("Oracle Corporation".equals(vendor)){
        String[] javaVersionElements = version.split("\\.|_|-b");

        //String discard = javaVersionElements[0];
        int major   = Integer.parseInt(javaVersionElements[1]);
        //String minor   = javaVersionElements[2];
        int update  = Integer.parseInt(javaVersionElements[3]);
        //String build   = javaVersionElements[4];

        // version to small for existing reset property:
        if((major == 7 && update<72) || major < 7){
            return true;
        }

        if(null != reset){
            // version recent enough and we have property:
            return "true".equals(reset);
        }else{
            // version recent enough, but no property:
            return major<8;
        }
    }
    return false;
}

现在,您可以调用 card.disconnect(TRUE);如果需要,TRUE 应为 false。请在使用前仔细测试。 我没有。

请注意,我从 SO 文章 Getting Java version at runtime 中获取了版本检测/拆分代码

关于java - JDK 7u79 中 javax.smartcardio.Card.disconnect(boolean reset) 的行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40460516/

10-12 02:47