JDK 7u79中javax.smartcardio.Card.disconnect(布尔重置)的行为?

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(布尔重置)方法 行为

在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指定


调用
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
时卡不会重置。