Почему месяц в январе 0 в Календаре Java?

Вы инициализируете свой SSLContext с помощью массива null KeyManager.

Ключ-менеджер - это то, что обрабатывает сертификат сервера (на стороне сервера), и это то, вероятно, для установки при использовании javax.net.ssl.keyStore.

Однако, как описано в Справочном руководстве JSSE , использование null для первого параметра не делает то, что вам кажется подумать, что это делает:

Если параметр KeyManager [] имеет значение NULL, то для этого контекста будет определен пустой KeyManager. Если параметр TrustManager [] равен NULL, установленным поставщикам безопасности будет поиск наивысшей приоритетной реализации TrustManagerFactory, из которой будет получен соответствующий TrustManager. Аналогично, параметр SecureRandom может быть нулевым, и в этом случае будет использоваться реализация по умолчанию.

blockquote>

Пустое KeyManager не содержит сертификатов RSA или DSA. Поэтому все блоки шифрования по умолчанию, которые будут полагаться на такой сертификат, будут отключены. Вот почему вы получаете все эти сообщения « Игнорирование недоступных сообщений шифра », что в конечном итоге приводит к сообщению об « без шифрования вообще ».

Если вы хотите, чтобы ваше хранилище ключей использовалось в качестве хранилища ключей, вам нужно загрузить его и инициализировать KeyManagerFactory с помощью него:

    KeyStore ks = KeyStore.getInstance("JKS");
    InputStream ksIs = new FileInputStream("...");
    try {
        ks.load(ksIs, "password".toCharArray());
    } finally {
        if (ksIs != null) {
            ksIs.close();
        }
    }

    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
            .getDefaultAlgorithm());
    kmf.init(ks, "keypassword".toCharArray());

Использовать kmf.getKeyManagers() в качестве первого параметра для SSLContext.init().

Для двух других параметров, поскольку вы явно не запрашиваете аутентификацию клиентского сертификата, вы должны оставить доверительный менеджер значением по умолчанию (null) вместо копирования / вставки доверительного менеджера, который является потенциальную причину уязвимости, и вы также можете использовать значение по умолчанию null SecureRandom.

292
задан Stéphane Bonniez 5 December 2008 в 16:23
поделиться

9 ответов

Это - просто часть ужасающей путаницы, которая является API даты/времени Java. Список что случилось с ним занял бы очень долгое время (и я уверен, что не знаю половины проблем). По общему признанию рабочий с датами и временем хитро, но aaargh так или иначе.

Делают себе одолжение и используют Время Joda вместо этого, или возможно JSR-310.

РЕДАКТИРОВАНИЕ: Что касается причин, почему - как отмечено в других ответах, это могло произойти из-за старых API C, или просто общего настроения запуска всего от 0... за исключением того, что дни запускаются с 1, конечно. Я сомневаюсь, мог ли кто-либо вне исходной команды внедрения действительно заявить причины - но снова, я буду убеждать читателей не волноваться так [приблизительно 117], почему плохие решения были приняты, чтобы посмотреть на целую палитру злобности в java.util.Calendar и найти что-то лучше.

Одна точка, которая является в пользу использования индексов на основе 0, - то, что оно делает вещи как "массивы имен" легче:

// I "know" there are 12 months
String[] monthNames = new String[12]; // and populate...
String name = monthNames[calendar.get(Calendar.MONTH)];

, Конечно, это перестало работать, как только Вы получаете календарь с 13 месяцами..., но по крайней мере определенный размер является числом месяцев, которые Вы ожидаете.

Это не хорошо причина, но это причина...

РЕДАКТИРОВАНИЕ: Как вид комментария запросов некоторые идеи о том, что я думаю, являются неправильными с Датой/Календарем:

  • Удивительные основания (1900 как год базируются на Дате, по общему признанию для конструкторов устаревших; 0 как основа месяца в обоих)
  • Переменчивость - использование неизменных типов делает очень более простым работать с тем, что действительно эффективно значения
  • недостаточный набор типов: хорошо иметь Date и Calendar как разные вещи, но разделение "локальных" по сравнению с "зонными" значениями отсутствует, как дата/время по сравнению с датой по сравнению со временем
  • API, который приводит к ужасному коду с волшебными константами вместо явно именованных методов
  • API, который очень трудно обосновать о - весь бизнес о том, когда вещи повторно вычисляются и т.д.
  • использование конструкторов без параметров для установки по умолчанию к "теперь", который приводит к твердому к тестовому коду
  • Date.toString() реализация, которая всегда использует системную зону местного времени (это смутило многих пользователей Переполнения стека до настоящего времени)
316
ответ дан assylias 4 November 2019 в 11:15
поделиться

В дополнение к ответу DannySmurf лени я добавлю, что это должно поощрить Вас использовать константы, такой как Calendar.JANUARY.

-1
ответ дан Powerlord 4 November 2019 в 11:15
поделиться

Это точно не определяется как нуль по сути, это определяется как Календарь. Январь. Это - проблема использования ints как константы вместо перечислений. Календарь. Январь == 0.

0
ответ дан Pål GD 4 November 2019 в 11:15
поделиться

Лично, я взял странность календарного API Java как признак, что я должен был отделить меня от Грегорианско-центрального мышления и попытки программировать более агностически в этом отношении. А именно, я учился еще раз избегать hardcoded констант для вещей как месяцы.

, Какое из следующего, более вероятно, будет корректно?

if (date.getMonth() == 3) out.print("March");

if (date.getMonth() == Calendar.MARCH) out.print("March");

Это иллюстрирует одну вещь, которая раздражает меня немного во Время Joda - это может поощрить программистов думать с точки зрения hardcoded констант. (Только немного, все же. Это не, как будто Joda принуждение программисты к программе плохо.)

4
ответ дан Paul Brinkley 4 November 2019 в 11:15
поделиться

Поскольку программисты одержимы индексами на основе 0. Хорошо, это немного более сложно, чем это: это имеет больше смысла, когда Вы работаете с логикой низшего уровня для использования индексации на основе 0. Но в общем и целом, я буду все еще придерживаться своего первого предложения.

7
ответ дан Dinah 4 November 2019 в 11:15
поделиться

Вероятно, потому что C "TM структуры" делает то же.

9
ответ дан Paul Tomblin 4 November 2019 в 11:15
поделиться

Я сказал бы лень. Массивы запускаются в 0 (все знают это); месяцы года являются массивом, который приводит меня полагать, что некоторый инженер в Sun просто не потрудился помещать эту небольшую точность в код Java.

9
ответ дан TheSmurf 4 November 2019 в 11:15
поделиться

В Java 8 существует новая дата/рремя API JSR 310 , которая более нормальна. Вывод спецификации совпадает с основным автором JodaTime, и они совместно используют много подобных понятий и шаблонов.

12
ответ дан Alex Miller 4 November 2019 в 11:15
поделиться

C базирующиеся языки копируют C до некоторой степени. tm структура (определенный в time.h) имеет целочисленное поле tm_mon с (прокомментированным) диапазоном 0-11.

C базировался, языки запускают массивы в индексе 0. Таким образом, это было удобно для вывода строки в массиве имен месяца, с tm_mon как индекс.

35
ответ дан stesch 4 November 2019 в 11:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: