Поведение javax.smartcardio.Card.disconnect(логический сброс) в JDK 7u79?
Согласно примечаниям к выпуску JRE 7u72:
Изменение в поведении метода javax.smartcardio.Card.disconnect(логический сброс)
До выпусков JDK 8u20 и JDK 7u72 метод javax.smartcardio.Card.disconnect(логический сброс) имел инвертированную логику для передаваемого ему логического значения "сброс". Карта была сброшена при отключении, если ему было передано значение false, и наоборот. Начиная с 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
до ВМ все отлично работает. Как это могло произойти? Старая версия JRE поставляется с JDK 7u79?
1 ответ
На мой взгляд, JRE ведет себя как ожидалось.
Имея Java 7 JRE с версией> 7u72, вы должны вызвать disnect(false) для сброса (по умолчанию. Это может быть перезаписано системным свойством, как вы упомянули). Здесь причина в том, что ошибка, которую вы должны вызвать disnect(false) для фактического разъединения, довольно старая и известная, так что довольно много программного обеспечения принимает и вызывает disnect(false) для сброса. Если бы Oracle изменил это поведение в каком-то незначительном выпуске / исправлении ошибки, они бы создали брешь в безопасности для всех программных проектов, которые исправили эту ошибку JRE / JDK в своем коде, вызвав disnect(false). По этой причине:
По умолчанию в этой области не будет замечено никаких изменений поведения для выпусков обновлений JDK 7.
(что является частью того, что вы цитировали из документации)
Если у вас есть какая-то Java 8 JRE, вы должны вызвать disnect(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); ИСТИНА должна быть ложной, если требуется. Пожалуйста, проверьте это внимательно, прежде чем использовать его. Я не.
Обратите внимание, что я взял код определения / разбиения версии из статьи SO Получение версии Java во время выполнения