根据JRE 7u72发行说明
布尔重置(javax.smartcardio.Card.disconnect)方法行为的变化 在JDK8u20和JDK7u72发布之前,javax.smartcardio.Card.disconnect(布尔重置)方法具有传递给它的“重置”布尔值的反转逻辑。如果将false传递给卡,则在断开连接时重新设置卡,反之亦然。从JDK7u72和JDK8u20开始,按照API文档实现了正确的行为。 为了向依赖旧行为的用户提供向后兼容性,引入了一个新的系统属性。以下命令行选项可用于强制执行旧的损坏行为: -Dsun.security.smartcardio.invertCardReset=true 默认情况下,为7u72和更高版本的JDK 7更新版本设置此属性。默认情况下,JDK 7更新版本在此区域不会注意到任何行为更改。 此外,还可以使用以下命令行选项来强制执行新的正确行为: -Dsun.security.smartcardio.invertCardReset=false 对于8u20和更高版本的JDK 8更新版本来说,这是默认的。在以后的Java版本中,该属性将被忽略/禁用,默认的断开方法行为将按照API的指定。
当调用javax.smartcardio.Card.disconnect(true)时,即使我有JDK7u79,卡也不会重置。当我向VM传递false或使用选项-Dsun.security.smartcardio.invertCardReset=true时,一切正常。这怎么可能是?JDK 7u79附带的是JRE的旧版本吗?
发布于 2017-01-30 12:22:37
在我看来,JRE的行为与预期的一样。
如果有一个版本超过7u72的Java7JRE,则必须调用disconnect(false)来重置(默认情况下)。这可能被系统属性覆盖,您已经提到了)。这里的原因是,您必须调用断开(False)才能真正断开连接的错误是非常古老和众所周知的,所以有些软件采用并调用断开(False)来重置。如果Oracle在一些小版本/ bug修复中更改了该行为,那么它们将为所有软件项目造成安全漏洞,这些软件项目通过调用disconnect(false)在代码中修复了这个JRE / JDK错误。为此原因:
默认情况下,JDK 7更新版本在此区域不会注意到任何行为更改。
(这是您从文档中引用的部分内容)
如果您有一些Java8JRE,默认情况下您必须调用disconnect(true),可能是由系统属性覆盖的。
因此,如果您现在想要创建一些代码,确保您的卡将被重置,这适用于java 7和8(甚至可能是更旧的和向上开始的版本),您必须评估您必须提交的内容,即:
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文章在运行时获取Java版本中提取了版本检测/拆分代码。
https://stackoverflow.com/questions/40460516
复制相似问题