2016-11-07 3 views
3

Согласно release notes of JRE 7u72:Поведение javax.smartcardio.Card.disconnect (булевский сброс) в JDK 7u79?

Изменения в javax.smartcardio.Card.disconnect (булев) сброс метод поведения

До JDK 8u20 и JDK 7u72 выпусков javax.smartcardio.Card .disconnect (boolean reset) инвертировал логику для логического значения «reset», переданного ей. Карта была сброшена после отключения, если к ней была передана ложь, и наоборот. Начиная с с JDK 7u72 и JDK 8u20, было выполнено правильное поведение по API .

Для обеспечения обратной совместимости с пользователями, которые полагаются на старое поведение , было введено новое системное свойство. Следующий параметр командной строки может быть использован для обеспечения старого сломанного поведения:

-Dsun.security.smartcardio.invertCardReset = истинный

Это свойство имеет значение по умолчанию для 7u72 и более поздних версий JDK 7 обновлений релизов , По умолчанию в этом области для релизов обновлений JDK 7 не наблюдается никакого изменения поведения.

также следующие опции командной строки может быть использована для обеспечения нового правильного поведения:

-Dsun.security.smartcardio.invertCardReset = ложь

Это по умолчанию для 8u20 и более поздних версиями JDK 8 обновления релизы. В будущем Java-релизы, свойство будет проигнорировано/отключено и по умолчанию поведение метода разъединения будет таким, как определено API.

При вызове javax.smartcardio.Card.disconnect(true) карта не сбрасывается, хотя у меня есть JDK 7u79. Когда я передаю false или воспользуюсь опцией -Dsun.security.smartcardio.invertCardReset=true VM, все будет хорошо. Как это могло произойти? Является ли более старая версия JRE поставляемой с JDK 7u79?

+0

Часть о передаче 'false' интересно, но часть о передаче' true' лишь подтверждает истинность документации вы цитированной , Неясно, что вы спрашиваете. – EJP

+0

@EJP Я спрашиваю, почему карта не сбрасывается, когда я передаю 'true' при использовании JDK 7u79. –

ответ

0

В моих глазах JRE ведет себя так, как ожидалось.

Имея Java 7 JRE с версией> 7u72, вы должны вызвать disconnect (false) для сброса (по умолчанию. Это может быть перезаписано упомянутым вами системным свойством). Здесь причина в том, что ошибка, которую вы должны вызвать disconnect (false) для фактического отключения, довольно устарела и известна, поэтому довольно некоторое программное обеспечение принимает и вызывает сброс (false) для сброса. Если бы Oracle изменила это поведение в некоторых незначительных исправлениях/ошибках, они бы создали нарушение безопасности для всех программных проектов, которые исправили эту ошибку JRE/JDK в своем коде, вызвав disconnect (false). По этой причине:

По умолчанию в этой области изменений в отношении обновлений JDK 7 не обнаружено.

(который является частью того, что вы процитировали из документации)

Если у вас есть Java 8 JRE, вы должны вызвать отключение (истина) по умолчанию, может быть переписан свойством системы.

Итак, если вы хотите создать код, удостоверяющий, что ваша карта будет сброшена, что работает для 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 должно быть ложным, если это необходимо. Пожалуйста, тщательно проверите это, прежде чем использовать его. Я этого не делал.

Обратите внимание, что я взял код обнаружения версии/расщепляющий из статьи SO Getting Java version at runtime

 Смежные вопросы

  • Нет связанных вопросов^_^