首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javax.smartcardio.Card.disconnect(布尔重置)在JDK 7u79中的行为

Javax.smartcardio.Card.disconnect(布尔重置)在JDK 7u79中的行为
EN

Stack Overflow用户
提问于 2016-11-07 08:12:09
回答 1查看 844关注 0票数 4

根据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的旧版本吗?

EN

回答 1

Stack Overflow用户

发布于 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(甚至可能是更旧的和向上开始的版本),您必须评估您必须提交的内容,即:

代码语言:javascript
复制
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版本中提取了版本检测/拆分代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40460516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档