JDK 7u79中javax.smartcardio.Card.disconnect(布尔重置)的行为?
根据报告: 更改javax.smartcardio.Card.disconnect(布尔重置)方法 行为 在JDK 8u20和JDK 7u72发布之前 已反转javax.smartcardio.Card.disconnect(布尔重置)方法 传递给它的“重置”布尔值的逻辑。卡被重置了 断开连接时,如果将false传递给它,反之亦然。启动 对于JDK 7u72和JDK 8u20,正确的行为符合API 文件编制工作已经落实 为了向依赖 旧的行为,引入了新的系统属性。以下 命令行选项可用于强制执行旧的中断行为: -Dsun.security.smartcardio.invertCardReset=true 此属性默认为7u72和更高版本的JDK 7更新设置 释放。默认情况下,在这个过程中不会注意到任何行为变化 JDK 7更新版本的区域 还可以使用以下命令行选项强制执行新的 正确的行为: -Dsun.security.smartcardio.invertCardReset=false 这是8u20和更高版本JDK 8更新版本的默认设置。将来 Java版本中,该属性将被忽略/禁用,默认为 断开方法行为将由API指定JDK 7u79中javax.smartcardio.Card.disconnect(布尔重置)的行为?,java,smartcard,Java,Smartcard,根据报告: 更改javax.smartcardio.Card.disconnect(布尔重置)方法 行为 在JDK 8u20和JDK 7u72发布之前 已反转javax.smartcardio.Card.disconnect(布尔重置)方法 传递给它的“重置”布尔值的逻辑。卡被重置了 断开连接时,如果将false传递给它,反之亦然。启动 对于JDK 7u72和JDK 8u20,正确的行为符合API 文件编制工作已经落实 为了向依赖 旧的行为,引入了新的系统属性。以下 命令行选项可用于强制执行旧的
调用
javax.smartcardio.Card.disconnect(true)
时,即使我有JDK 7u79,卡也不会重置。当我向虚拟机传递false
或使用选项-Dsun.security.smartcardio.invertCardReset=true
时,一切正常。这怎么可能?jdk7u79是否附带了较旧版本的JRE?在我看来,JRE的行为与预期一致
对于版本>7u72的Java 7 JRE,您必须调用disconnect(false)进行重置(默认情况下,这可能会被您提到的系统属性覆盖)。这里的原因是,您必须调用disconnect(false)来实际断开连接的bug非常古老和已知,因此相当多的软件采用并调用disconnect(false)来重置。如果Oracle在某个小版本/错误修复中改变了这种行为,他们会为所有软件项目创建一个安全漏洞,这些项目通过调用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;
}
最终静态布尔值TRUE;
静止的{
字符串ven=System.getProperty(“java.vendor”);
String ver=System.getProperty(“java.runtime.version”);
字符串r=System.getProperty(“sun.security.smartcardio.invertCardReset”);
真=!反向复位(垂直、垂直、垂直);
}
静态布尔值重置(字符串供应商、字符串版本、字符串重置){
if(“Oracle公司”。等于(供应商)){
String[]javaVersionElements=version.split(“\\.\u124;|-b”);
//字符串discard=javaVersionElements[0];
int major=Integer.parseInt(javaVersionElements[1]);
//String minor=javaVersionElements[2];
int update=Integer.parseInt(javaVersionElements[3]);
//字符串build=javaVersionElements[4];
//现有重置属性的小版本:
if((major==7&&update)关于传递false
的部分很有趣,但是关于传递true
的部分仅仅证实了您引用的文档的真实性。不清楚您在问什么。@EJP我在问为什么在使用JDK 7u79时,当我传递true
时卡不会重置。