根据 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/