Зиновий Львович Рабинович (род. 1 августа 1918) — советский учёный (кибернетик), профессор; один из двух авторов первой в СССР электронной вычислительной машины с программой, хранимой в памяти.
Анатолий Игоревич Тихоцкий (род. 1 августа 1949, г. Березники Пермской обл.) — советский и российский учёный в области технической кибернетики и теории информации; руководил созданием автоматизированной интеллектуальной системы обучения программированию и занимался разработкой методов искусственного интеллекта и цифровой обработки сигналов.
Боривой Ж. Лазич (серб. Боривој Ж. Лазић; род. 1 августа 1939 Помияча) — югославский учёный в области информатики, профессор; известен как разработчик компьютеров и автор учебников по вычислительной технике.
Марко Бёррис (род. 1 августа 1968 года) — немецкий IT-предприниматель, основатель компании Star Division; под его руководством был разработан офисный пакет StarOffice (ставший основой OpenOffice).
#Biography #Birth_Date
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Первая программа на Java
Запустите IntelliJ IDEA:
Windows: Найдите ярлык IntelliJ IDEA на рабочем столе или в меню «Пуск» и дважды кликните.
macOS: Откройте приложение из папки «Программы» или через Spotlight (Cmd + Пробел, введите «IntelliJ IDEA»).
Linux: Запустите через команду ./idea.sh из папки bin (например, ~/idea/idea-IC-*/bin/) или найдите в меню приложений.
При первом запуске примите лицензионное соглашение и выберите тему (светлую или темную). Для новичков стандартные настройки подойдут.
Создайте новый проект:
На главном экране выберите File → New → Project.
В появившемся окне:
Выберите Java в левой панели.
Убедитесь, что в поле Project SDK указана версия JDK (например, 17). Если JDK не настроена, нажмите «New» и укажите путь к папке JDK (например, C:\Program Files\Java\jdk-17 на Windows или /Library/Java/JavaVirtualMachines/jdk-17 на macOS).
Оставьте остальные настройки по умолчанию и нажмите «Next».
Дайте проекту имя, например, MyFirstJavaProject, и выберите папку для сохранения.
Нажмите «Create».
Создание класса
В Java всё основано на классах. Класс — это шаблон, который описывает данные и поведение объектов. Давайте создадим наш первый класс.
Создайте класс:
В дереве проекта (слева) найдите папку src.
Щелкните правой кнопкой мыши на src → New → Java Class.
Введите имя класса, например, HelloWorld. Убедитесь, что выбран тип «Class».
Нажмите «OK».
IntelliJ IDEA создаст файл HelloWorld.java с базовой структурой:
Добавьте метод main:
Внутри класса добавьте метод main, который является точкой входа в программу:
Структура класса
Класс в Java — это основная единица программы.
Рассмотрим структуру класса HelloWorld:
Заголовок класса:
public — модификатор доступа, означает, что класс доступен из любого другого кода.
class — ключевое слово, обозначающее создание класса.
HelloWorld — имя класса, должно совпадать с именем файла (HelloWorld.java).
Тело класса:
Внутри фигурных скобок {} размещаются поля, конструкторы и методы.
В нашем примере мы добавили метод main.
Обзор метода main
Метод main — это точка входа в Java-программу. Когда вы запускаете программу, JVM ищет именно этот метод, чтобы начать выполнение.
Сигнатура метода main:
Разберем каждый элемент:
public: Метод доступен из любого кода.
static: Метод принадлежит классу, а не объекту, поэтому его можно вызвать без создания экземпляра класса.
void: Метод ничего не возвращает.
main: Имя метода, которое JVM ищет для запуска программы.
String[] args: Массив строк, содержащий аргументы командной строки, переданные при запуске программы. Например, если вы запускаете java HelloWorld test, args[0] будет равно "test".
Пример использования args:
Совет для новичков: На начальном этапе вы можете игнорировать args, но позже они пригодятся для передачи параметров в программу.
Написание и запуск "Hello, World!" через IDE
Добавьте код в класс:
Откройте файл HelloWorld.java и добавьте вывод сообщения:
Запустите программу в IntelliJ IDEA:
Щелкните правой кнопкой мыши на файле HelloWorld.java в дереве проекта.
Выберите Run 'HelloWorld.main()'.
Внизу в консоли IntelliJ IDEA вы увидите вывод:
#Java #для_новичков #beginner #First_Programm #Scanner #System_out_println
Запустите IntelliJ IDEA:
Windows: Найдите ярлык IntelliJ IDEA на рабочем столе или в меню «Пуск» и дважды кликните.
macOS: Откройте приложение из папки «Программы» или через Spotlight (Cmd + Пробел, введите «IntelliJ IDEA»).
Linux: Запустите через команду ./idea.sh из папки bin (например, ~/idea/idea-IC-*/bin/) или найдите в меню приложений.
При первом запуске примите лицензионное соглашение и выберите тему (светлую или темную). Для новичков стандартные настройки подойдут.
Создайте новый проект:
На главном экране выберите File → New → Project.
В появившемся окне:
Выберите Java в левой панели.
Убедитесь, что в поле Project SDK указана версия JDK (например, 17). Если JDK не настроена, нажмите «New» и укажите путь к папке JDK (например, C:\Program Files\Java\jdk-17 на Windows или /Library/Java/JavaVirtualMachines/jdk-17 на macOS).
Оставьте остальные настройки по умолчанию и нажмите «Next».
Дайте проекту имя, например, MyFirstJavaProject, и выберите папку для сохранения.
Нажмите «Create».
Создание класса
В Java всё основано на классах. Класс — это шаблон, который описывает данные и поведение объектов. Давайте создадим наш первый класс.
Создайте класс:
В дереве проекта (слева) найдите папку src.
Щелкните правой кнопкой мыши на src → New → Java Class.
Введите имя класса, например, HelloWorld. Убедитесь, что выбран тип «Class».
Нажмите «OK».
IntelliJ IDEA создаст файл HelloWorld.java с базовой структурой:
public class HelloWorld {
}
Добавьте метод main:
Внутри класса добавьте метод main, который является точкой входа в программу:
public class HelloWorld {
public static void main(String[] args) {
// Здесь будет код
}
}
Можно быстро добавить набрав psvm и нажав tab
Структура класса
Класс в Java — это основная единица программы.
Рассмотрим структуру класса HelloWorld:
public class HelloWorld {
// Поля (переменные класса)
// Конструкторы
// Методы
public static void main(String[] args) {
// Код программы
}
}
Заголовок класса:
public — модификатор доступа, означает, что класс доступен из любого другого кода.
class — ключевое слово, обозначающее создание класса.
HelloWorld — имя класса, должно совпадать с именем файла (HelloWorld.java).
Тело класса:
Внутри фигурных скобок {} размещаются поля, конструкторы и методы.
В нашем примере мы добавили метод main.
Обзор метода main
Метод main — это точка входа в Java-программу. Когда вы запускаете программу, JVM ищет именно этот метод, чтобы начать выполнение.
Сигнатура метода main:
public static void main(String[] args)
Разберем каждый элемент:
public: Метод доступен из любого кода.
static: Метод принадлежит классу, а не объекту, поэтому его можно вызвать без создания экземпляра класса.
void: Метод ничего не возвращает.
main: Имя метода, которое JVM ищет для запуска программы.
String[] args: Массив строк, содержащий аргументы командной строки, переданные при запуске программы. Например, если вы запускаете java HelloWorld test, args[0] будет равно "test".
Пример использования args:
public class HelloWorld {
public static void main(String[] args) {
if (args.length > 0) {
System.out.println("Аргумент: " + args[0]);
} else {
System.out.println("Аргументы не переданы");
}
}
}
Совет для новичков: На начальном этапе вы можете игнорировать args, но позже они пригодятся для передачи параметров в программу.
Написание и запуск "Hello, World!" через IDE
Добавьте код в класс:
Откройте файл HelloWorld.java и добавьте вывод сообщения:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Запустите программу в IntelliJ IDEA:
Щелкните правой кнопкой мыши на файле HelloWorld.java в дереве проекта.
Выберите Run 'HelloWorld.main()'.
Внизу в консоли IntelliJ IDEA вы увидите вывод:
Hello, World!
#Java #для_новичков #beginner #First_Programm #Scanner #System_out_println
👍1
Что делает System.out.println?:
System — класс из стандартной библиотеки Java.
out — статическое поле типа PrintStream, отвечающее за вывод в консоль.
println — метод, который выводит строку и добавляет перенос строки (\n).
Ввод и вывод данных
Теперь давайте сделаем программу интерактивной, используя ввод и вывод.
Вывод данных
Java предоставляет несколько способов вывода данных в консоль:
System.out.println: Выводит строку с переносом строки.
System.out.println("Hello, World!"); // Вывод: Hello, World!
System.out.print: Выводит строку без переноса строки.
System.out.print("Hello, ");
System.out.print("World!"); // Вывод: Hello, World!
System.out.printf: Форматированный вывод, аналогичный printf в C. Использует спецификаторы формата, такие как %s (строка), %d (целое число), %f (число с плавающей точкой).
Ввод данных с помощью класса Scanner
Класс Scanner из пакета java.util позволяет считывать данные из консоли (или других источников).
Пример программы с вводом:
Создайте файл Greeting.java:
Запуск через IDE:
Щелкните правой кнопкой мыши на Greeting.java → Run 'Greeting.main()'.
В консоли IntelliJ IDEA введите имя (например, Алексей) и нажмите Enter.
Ожидаемый вывод:
Запуск через терминал:
Перейдите в папку с файлом:
Скомпилируйте:
Запустите:
Введите имя и получите тот же вывод.
Работа с Scanner
Импорт: import java.util.Scanner; необходим для использования класса.
Создание объекта:
Методы Scanner:
nextLine(): Считывает строку до нажатия Enter.
next(): Считывает одно слово (до пробела).
nextInt(): Считывает целое число.
nextDouble(): Считывает число с плавающей точкой.
Закрытие: Всегда закрывайте Scanner с помощью scanner.close() после использования, чтобы избежать утечек ресурсов.
Пример с числами:
Обработка ошибок ввода
Если пользователь введет некорректные данные (например, буквы вместо числа для nextInt), программа выбросит исключение InputMismatchException.
Для безопасности добавьте обработку:
Практические советы для новичков
Проверяйте имена файлов: Имя файла должно совпадать с именем класса (HelloWorld.java для класса HelloWorld).
Используйте IDE для обучения: IntelliJ IDEA подсвечивает ошибки и предлагает исправления (Alt+Enter). Это ускоряет изучение.
Экспериментируйте с вводом/выводом:
Попробуйте написать программу, которая запрашивает у пользователя два числа и выводит их сумму.
Используйте System.out.printf для форматированного вывода с разными типами данных.
Кодировка в терминале (Windows):
Если русские символы отображаются некорректно, используйте:
#Java #для_новичков #beginner #First_Programm #Scanner #System_out_println
System — класс из стандартной библиотеки Java.
out — статическое поле типа PrintStream, отвечающее за вывод в консоль.
println — метод, который выводит строку и добавляет перенос строки (\n).
Ввод и вывод данных
Теперь давайте сделаем программу интерактивной, используя ввод и вывод.
Вывод данных
Java предоставляет несколько способов вывода данных в консоль:
System.out.println: Выводит строку с переносом строки.
System.out.println("Hello, World!"); // Вывод: Hello, World!
System.out.print: Выводит строку без переноса строки.
System.out.print("Hello, ");
System.out.print("World!"); // Вывод: Hello, World!
System.out.printf: Форматированный вывод, аналогичный printf в C. Использует спецификаторы формата, такие как %s (строка), %d (целое число), %f (число с плавающей точкой).
String name = "Алексей";
int age = 30;
System.out.printf("Имя: %s, Возраст: %d%n", name, age);
// Вывод: Имя: Алексей, Возраст: 30
%n — перенос строки, платформонезависимый.
Другие спецификаторы: %b (булево), %c (символ), %.2f (два знака после запятой для чисел с плавающей точкой).
Ввод данных с помощью класса Scanner
Класс Scanner из пакета java.util позволяет считывать данные из консоли (или других источников).
Пример программы с вводом:
Создайте файл Greeting.java:
import java.util.Scanner;
public class Greeting {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Введите ваше имя:");
String name = scanner.nextLine();
System.out.printf("Привет, %s!%n", name);
scanner.close();
}
}
Запуск через IDE:
Щелкните правой кнопкой мыши на Greeting.java → Run 'Greeting.main()'.
В консоли IntelliJ IDEA введите имя (например, Алексей) и нажмите Enter.
Ожидаемый вывод:
Введите ваше имя:
Алексей
Привет, Алексей!
Запуск через терминал:
Перейдите в папку с файлом:
cd путь/к/папке/MyFirstJavaProject/src
Скомпилируйте:
javac Greeting.java
Запустите:
java Greeting
Введите имя и получите тот же вывод.
Работа с Scanner
Импорт: import java.util.Scanner; необходим для использования класса.
Создание объекта:
Scanner scanner = new Scanner(System.in); подключает Scanner к консоли.
Методы Scanner:
nextLine(): Считывает строку до нажатия Enter.
next(): Считывает одно слово (до пробела).
nextInt(): Считывает целое число.
nextDouble(): Считывает число с плавающей точкой.
Закрытие: Всегда закрывайте Scanner с помощью scanner.close() после использования, чтобы избежать утечек ресурсов.
Пример с числами:
Scanner scanner = new Scanner(System.in);
System.out.println("Введите возраст:");
int age = scanner.nextInt();
System.out.printf("Ваш возраст: %d%n", age);
scanner.close();
Обработка ошибок ввода
Если пользователь введет некорректные данные (например, буквы вместо числа для nextInt), программа выбросит исключение InputMismatchException.
Для безопасности добавьте обработку:
Scanner scanner = new Scanner(System.in);
System.out.println("Введите возраст:");
try {
int age = scanner.nextInt();
System.out.printf("Ваш возраст: %d%n", age);
} catch (java.util.InputMismatchException e) {
System.out.println("Ошибка: введите целое число!");
}
scanner.close();
Практические советы для новичков
Проверяйте имена файлов: Имя файла должно совпадать с именем класса (HelloWorld.java для класса HelloWorld).
Используйте IDE для обучения: IntelliJ IDEA подсвечивает ошибки и предлагает исправления (Alt+Enter). Это ускоряет изучение.
Экспериментируйте с вводом/выводом:
Попробуйте написать программу, которая запрашивает у пользователя два числа и выводит их сумму.
Используйте System.out.printf для форматированного вывода с разными типами данных.
Кодировка в терминале (Windows):
Если русские символы отображаются некорректно, используйте:
javac -encoding UTF-8 Greeting.java
java -Dfile.encoding=UTF-8 Greeting
#Java #для_новичков #beginner #First_Programm #Scanner #System_out_println
👍1
Что выведет код?
#Tasks
import java.util.concurrent.CountDownLatch;
public class Task010825 {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
new Thread(() -> {
latch.countDown();
latch.countDown();
}).start();
latch.await();
System.out.println("Completed");
}
}
#Tasks
👍1
Варианты ответа:
Anonymous Quiz
15%
IllegalStateException
0%
Ошибка компиляции
85%
"Completed"
0%
Ничего не выведет (зависнет)
👍1
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Предлагаем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Предлагаем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Condition в Java? 🤓
Ответ:
Condition (используется с Lock) предоставляет аналог wait() и notify() для более гибкой синхронизации.
Пример:
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
condition.await(); // Ждет сигнала
} finally {
lock.unlock();
}
Позволяет создавать несколько условий для одного Lock.
#собеседование
Ответ:
Пример:
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
condition.await(); // Ждет сигнала
} finally {
lock.unlock();
}
Позволяет создавать несколько условий для одного Lock.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Сергей Михайлович Белоусов (род. 2 августа 1971 года, Ленинград, СССР) - российский (по рождению) IT-предприниматель и изобретатель, основатель международных IT-компаний Acronis, Parallels и других, имеет свыше 350 патентов, внёсший вклад в развитие технологий виртуализации и защиты данных.
Джон Мэ́ттью Влиси́дис (Влисси́дес) (англ. John Matthew Vlissides; 2 августа 1961, Вашингтон, округ Колумбия, США — 24 ноября 2005, Уэстчестер, Нью-Йорк, США) - американский учёный и инженер в области компьютерных наук, наиболее известен как один из авторов классической книги по паттернам проектирования “Design Patterns: Elements of Reusable Object-Oriented Software” («Приёмы объектно-ориентированного проектирования»). Его вклад заключался в развитии методов проектирования ПО и популяризации архитектурных шаблонов (Gang of Four).
#Biography #Birth_Date
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
С 26.07 по 01.08
Предыдущий пост(с 19.07 по 25.07)
Воскресный мотивационный пост:
Как не разрушаться от критики и при чём тут эмоциональный интеллект
Выбранная голосованием тема:
OkHttp для Java
Запись встреч/видео:
Apache Kafka
Обучающие статьи:
Задачи и жизненный цикл в Gradle
Плагины и расширение функциональности в Gradle
Основы работы с терминалом в Java
Обзор платформ для разработки на Java
Первая программа на Java
Полезные статьи и видео:
Как провалить собеседование в IT? 7 типичных ошибок (и как их избежать)
Подборка полезных API
GPT в реальных проектах: взгляд разработчика Spring AI | Евгений Борисов
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Предыдущий пост(с 19.07 по 25.07)
Воскресный мотивационный пост:
Как не разрушаться от критики и при чём тут эмоциональный интеллект
Выбранная голосованием тема:
OkHttp для Java
Запись встреч/видео:
Apache Kafka
Обучающие статьи:
Задачи и жизненный цикл в Gradle
Плагины и расширение функциональности в Gradle
Основы работы с терминалом в Java
Обзор платформ для разработки на Java
Первая программа на Java
Полезные статьи и видео:
Как провалить собеседование в IT? 7 типичных ошибок (и как их избежать)
Подборка полезных API
GPT в реальных проектах: взгляд разработчика Spring AI | Евгений Борисов
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
👍2
После проведенного голосования, с выбрана тема - JWT (JSON Web Token)
Ну читаем'с ниже статейкуРанее мы рассматривали эту тему, но сейчас более развернуто. Если нужно рассмотреть эту тему более подробно - пишите в комментах, буду готовить 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java for Beginner
Выбираем темы для рассмотрения в следующие выходные! 🤨
Mockito / Retrofit / JWT / Nginx / NoSQL BD / GraphQL
Mockito / Retrofit / JWT / Nginx / NoSQL BD / GraphQL
Обзор JSON Web Tokens (JWT) в Java
JSON Web Tokens (JWT) — это стандарт для создания компактных, самодостаточных токенов, используемых для безопасной передачи информации между сторонами в виде JSON-объекта. JWT широко применяется для аутентификации и авторизации в веб-приложениях, особенно в REST API. В Java экосистема библиотек, таких как jjwt и java-jwt, предоставляет мощные инструменты для работы с JWT.
Структура JWT
JWT состоит из трех основных частей, разделенных точками (.):
Header — содержит метаданные о токене, такие как тип (typ: JWT) и алгоритм подписи (например, alg: HS256 или RS256).
Payload — содержит полезные данные (claims), такие как идентификатор пользователя (sub), время выпуска (iat), срок действия (exp) и кастомные данные.
Signature — подпись, созданная с использованием секретного ключа или пары ключей (для асимметричных алгоритмов), для проверки целостности и подлинности токена.
Каждая часть кодируется в Base64Url и объединяется в строку вида: Header.Payload.Signature.
Пример JWT:
Использование JWT в Java
Наиболее популярная библиотека для работы с JWT в Java — это io.jsonwebtoken:jjwt. Она поддерживает создание, парсинг и валидацию токенов с использованием различных алгоритмов подписи.
Установка зависимости
Добавьте зависимость в pom.xml для Maven:
Создание JWT
Пример создания JWT с использованием HMAC-SHA256:
Парсинг и валидация JWT
Пример проверки и извлечения данных из токена:
Управление памятью и производительность
1. Размер токена и влияние на память
JWT компактны, но их размер зависит от содержимого payload и используемого алгоритма.
Например:
HMAC-SHA256 (симметричный) создает токены меньшего размера, так как используется один ключ.
RSA/ECDSA (асимметричные алгоритмы) увеличивают размер подписи, что может быть заметно при большом количестве токенов.
Payload с большим количеством claims (например, сложные JSON-объекты) увеличивает объем токена, что влияет на объем передаваемых данных и потребление памяти.
Рекомендации:
Минимизируйте количество claims в payload. Храните только необходимые данные, такие как sub, iat, exp.
Используйте сжатие (например, JWS Compression с DEF в jjwt) для уменьшения размера токена, если это допустимо.
#Java #middle #on_request #Jwt
JSON Web Tokens (JWT) — это стандарт для создания компактных, самодостаточных токенов, используемых для безопасной передачи информации между сторонами в виде JSON-объекта. JWT широко применяется для аутентификации и авторизации в веб-приложениях, особенно в REST API. В Java экосистема библиотек, таких как jjwt и java-jwt, предоставляет мощные инструменты для работы с JWT.
Структура JWT
JWT состоит из трех основных частей, разделенных точками (.):
Header — содержит метаданные о токене, такие как тип (typ: JWT) и алгоритм подписи (например, alg: HS256 или RS256).
Payload — содержит полезные данные (claims), такие как идентификатор пользователя (sub), время выпуска (iat), срок действия (exp) и кастомные данные.
Signature — подпись, созданная с использованием секретного ключа или пары ключей (для асимметричных алгоритмов), для проверки целостности и подлинности токена.
Каждая часть кодируется в Base64Url и объединяется в строку вида: Header.Payload.Signature.
Пример JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Использование JWT в Java
Наиболее популярная библиотека для работы с JWT в Java — это io.jsonwebtoken:jjwt. Она поддерживает создание, парсинг и валидацию токенов с использованием различных алгоритмов подписи.
Установка зависимости
Добавьте зависимость в pom.xml для Maven:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.12.6</version>
</dependency>
Создание JWT
Пример создания JWT с использованием HMAC-SHA256:
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
public class JwtExample {
public static String createJwt(String subject, long ttlMillis) {
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); // Генерация ключа
return Jwts.builder()
.setSubject(subject)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + ttlMillis))
.signWith(key)
.compact();
}
}
Парсинг и валидация JWT
Пример проверки и извлечения данных из токена:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
public class JwtExample {
public static Claims parseJwt(String jwt, String secret) {
Key key = Keys.hmacShaKeyFor(secret.getBytes());
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(jwt)
.getBody();
}
}
Управление памятью и производительность
1. Размер токена и влияние на память
JWT компактны, но их размер зависит от содержимого payload и используемого алгоритма.
Например:
HMAC-SHA256 (симметричный) создает токены меньшего размера, так как используется один ключ.
RSA/ECDSA (асимметричные алгоритмы) увеличивают размер подписи, что может быть заметно при большом количестве токенов.
Payload с большим количеством claims (например, сложные JSON-объекты) увеличивает объем токена, что влияет на объем передаваемых данных и потребление памяти.
Рекомендации:
Минимизируйте количество claims в payload. Храните только необходимые данные, такие как sub, iat, exp.
Используйте сжатие (например, JWS Compression с DEF в jjwt) для уменьшения размера токена, если это допустимо.
#Java #middle #on_request #Jwt
👍2
2. Кэширование ключей
Создание и парсинг ключей (особенно для асимметричных алгоритмов, таких как RSA) — дорогостоящая операция с точки зрения CPU и памяти.
Например:
Генерация RSA-ключей требует значительных вычислительных ресурсов.
Повторное декодирование Base64-строк для ключей при каждом запросе увеличивает нагрузку.
Рекомендации:
Кэшируйте ключи в памяти (например, в ConcurrentHashMap или с использованием Spring Cache).
Используйте пул ключей для многопоточных приложений, чтобы избежать создания новых экземпляров Key для каждого запроса.
Пример кэширования ключа:
3. Многопоточность
Библиотека jjwt потокобезопасна, но неправильное управление ключами или токенами может привести к проблемам.
Например:
Неправильное использование ThreadLocal для хранения временных ключей может привести к утечкам памяти.
Частое создание JwtParser без повторного использования увеличивает потребление ресурсов.
Рекомендации:
Создавайте и конфигурируйте JwtParserBuilder один раз и переиспользуйте его.
Используйте ThreadLocal только для временных данных, которые очищаются после обработки запроса.
Пример потокобезопасного парсера:
Нюансы безопасности
1. Выбор алгоритма подписи
HMAC-SHA (HS256, HS384, HS512): Быстрее, но требует безопасного хранения секретного ключа на всех серверах. Утечка ключа компрометирует всю систему.
RSA/ECDSA: Медленнее, но безопаснее, так как публичный ключ используется для проверки, а приватный хранится только на сервере, выдающем токены.
None-алгоритм: Никогда не используйте alg: none, так как это позволяет подделывать токены без подписи.
Рекомендации:
Для микросервисов с централизованным управлением ключами предпочтительнее RSA/ECDSA.
Используйте jjwt с настройкой require("alg"), чтобы предотвратить атаки с изменением алгоритма:
2. Срок действия токена
Короткий срок действия (exp) снижает риск использования украденных токенов, но увеличивает нагрузку на сервер из-за частого обновления токенов (refresh tokens).
Рекомендации:
Устанавливайте exp в пределах 15-60 минут для access-токенов.
Используйте refresh-токены с более длинным сроком действия и строгим контролем (например, храните их в базе данных с возможностью отзыва).
3. Уязвимости
JWT Header Injection: Атакующий может изменить заголовок, чтобы подменить алгоритм (например, с RS256 на HS256). Всегда проверяйте алгоритм при парсинге.
Weak Keys: Слабые или предсказуемые ключи для HMAC-SHA делают токены уязвимыми для brute-force атак.
Payload Tampering: Если токен не подписан или подпись не проверяется, злоумышленник может изменить payload.
Рекомендации:
Используйте ключи достаточной длины (например, 256 бит для HS256).
Проверяйте подпись токена на каждом запросе.
Включайте jti (JWT ID) для отслеживания и отзыва токенов.
#Java #middle #on_request #Jwt
Создание и парсинг ключей (особенно для асимметричных алгоритмов, таких как RSA) — дорогостоящая операция с точки зрения CPU и памяти.
Например:
Генерация RSA-ключей требует значительных вычислительных ресурсов.
Повторное декодирование Base64-строк для ключей при каждом запросе увеличивает нагрузку.
Рекомендации:
Кэшируйте ключи в памяти (например, в ConcurrentHashMap или с использованием Spring Cache).
Используйте пул ключей для многопоточных приложений, чтобы избежать создания новых экземпляров Key для каждого запроса.
Пример кэширования ключа:
private static final Key SIGNING_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
public static String createJwt(String subject, long ttlMillis) {
return Jwts.builder()
.setSubject(subject)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + ttlMillis))
.signWith(SIGNING_KEY)
.compact();
}
3. Многопоточность
Библиотека jjwt потокобезопасна, но неправильное управление ключами или токенами может привести к проблемам.
Например:
Неправильное использование ThreadLocal для хранения временных ключей может привести к утечкам памяти.
Частое создание JwtParser без повторного использования увеличивает потребление ресурсов.
Рекомендации:
Создавайте и конфигурируйте JwtParserBuilder один раз и переиспользуйте его.
Используйте ThreadLocal только для временных данных, которые очищаются после обработки запроса.
Пример потокобезопасного парсера:
private static final JwtParser JWT_PARSER = Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor("secret".getBytes()))
.build();
public static Claims parseJwt(String jwt) {
return JWT_PARSER.parseClaimsJws(jwt).getBody();
}
Нюансы безопасности
1. Выбор алгоритма подписи
HMAC-SHA (HS256, HS384, HS512): Быстрее, но требует безопасного хранения секретного ключа на всех серверах. Утечка ключа компрометирует всю систему.
RSA/ECDSA: Медленнее, но безопаснее, так как публичный ключ используется для проверки, а приватный хранится только на сервере, выдающем токены.
None-алгоритм: Никогда не используйте alg: none, так как это позволяет подделывать токены без подписи.
Рекомендации:
Для микросервисов с централизованным управлением ключами предпочтительнее RSA/ECDSA.
Используйте jjwt с настройкой require("alg"), чтобы предотвратить атаки с изменением алгоритма:
Jwts.parserBuilder()
.require("alg", "RS256")
.setSigningKey(publicKey)
.build();
2. Срок действия токена
Короткий срок действия (exp) снижает риск использования украденных токенов, но увеличивает нагрузку на сервер из-за частого обновления токенов (refresh tokens).
Рекомендации:
Устанавливайте exp в пределах 15-60 минут для access-токенов.
Используйте refresh-токены с более длинным сроком действия и строгим контролем (например, храните их в базе данных с возможностью отзыва).
3. Уязвимости
JWT Header Injection: Атакующий может изменить заголовок, чтобы подменить алгоритм (например, с RS256 на HS256). Всегда проверяйте алгоритм при парсинге.
Weak Keys: Слабые или предсказуемые ключи для HMAC-SHA делают токены уязвимыми для brute-force атак.
Payload Tampering: Если токен не подписан или подпись не проверяется, злоумышленник может изменить payload.
Рекомендации:
Используйте ключи достаточной длины (например, 256 бит для HS256).
Проверяйте подпись токена на каждом запросе.
Включайте jti (JWT ID) для отслеживания и отзыва токенов.
#Java #middle #on_request #Jwt
👍2
Оптимизация и масштабирование
1. Хранение и ротация ключей
Для HMAC-SHA ключи должны безопасно храниться (например, в Vault или AWS KMS).
Для RSA/ECDSA используйте ротацию ключей с поддержкой JWK (JSON Web Key) для автоматического обновления публичных ключей.
2. Масштабирование в микросервисах
Централизуйте выдачу токенов через отдельный сервис (например, Auth Service).
Используйте JWK для распространения публичных ключей между сервисами.
3. Кэширование токенов
Кэшируйте проверенные токены в Redis или другом in-memory хранилище, чтобы снизить нагрузку на парсинг и валидацию.
Используйте TTL кэша, соответствующий exp токена.
4. Логирование и мониторинг
Логируйте попытки использования невалидных или истекших токенов для анализа атак.
Мониторьте время парсинга и валидации токенов, чтобы выявить узкие места.
Пример интеграции с Spring Security
JWT часто используется в связке с Spring Security для защиты REST API.
Пример конфигурации:
#Java #middle #on_request #Jwt
1. Хранение и ротация ключей
Для HMAC-SHA ключи должны безопасно храниться (например, в Vault или AWS KMS).
Для RSA/ECDSA используйте ротацию ключей с поддержкой JWK (JSON Web Key) для автоматического обновления публичных ключей.
2. Масштабирование в микросервисах
Централизуйте выдачу токенов через отдельный сервис (например, Auth Service).
Используйте JWK для распространения публичных ключей между сервисами.
3. Кэширование токенов
Кэшируйте проверенные токены в Redis или другом in-memory хранилище, чтобы снизить нагрузку на парсинг и валидацию.
Используйте TTL кэша, соответствующий exp токена.
4. Логирование и мониторинг
Логируйте попытки использования невалидных или истекших токенов для анализа атак.
Мониторьте время парсинга и валидации токенов, чтобы выявить узкие места.
Пример интеграции с Spring Security
JWT часто используется в связке с Spring Security для защиты REST API.
Пример конфигурации:
import io.jsonwebtoken.Jwts;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/public").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String header = request.getHeader("Authorization");
if (header != null && header.startsWith("Bearer ")) {
String token = header.substring(7);
try {
Claims claims = Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor("secret".getBytes()))
.build()
.parseClaimsJws(token)
.getBody();
String username = claims.getSubject();
if (username != null) {
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
username, null, Collections.emptyList());
SecurityContextHolder.getContext().setAuthentication(auth);
}
} catch (Exception e) {
SecurityContextHolder.clearContext();
}
}
chain.doFilter(request, response);
}
}
#Java #middle #on_request #Jwt
👍2
Вячеслав Васильевич Петров (3 августа 1940, г. Лиски, Воронежская область, РСФСР, СССР).
Советский учёный в области информационных технологий и оптоэлектронных систем хранения информации, академик НАН Украины, директор Института проблем регистрации информации НАН Украины. Разработал основы оптических запоминающих устройств большой ёмкости и участвовал в координации национальных программ информатизации.
Эдвард Делано Лазовска (Edward Delano Lazowska) – родился 3 августа 1950 года.
Американский учёный в области информатики, профессор Вашингтонского университета, внёс значительный вклад в теорию и практику высокопроизводительных вычислений и систем связи. Соавтор фундаментального учебника по анализу производительности компьютерных систем и участник разработки методов эффективного управления ресурсами в многопроцессорных и сетевых средах.
Дханурджей «DJ» Патил (Dhanurjay Patil) – родился 3 августа 1974 года.
Американский математик и специалист по компьютерным наукам, с 2015 по 2017 год первый Chief Data Scientist США (советник Белого дома по наукам о данных). Известен как один из пионеров «науки о данных» (data science), разрабатывал методики анализа больших данных для государственной политики и коммерческих проектов.
#Biography #Birth_Date
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Сломай свой хаос 😵💫
Ты начал работать на удалёнке.
Никто не говорит тебе, когда начинать.
Хочешь — работай днём, хочешь — ночью. Важен только результат.
Звучит как мечта, да?
На самом деле — это ловушка.
Потому что без самоорганизации ты быстро превратишься в зомби, который "делает вид, что работает", а внутри тонет в хаосе.
🤫 Самообучение смертельно опасно, если заниматься этим беспорядочно
Курсы, видео, статьи, pet-проекты.
Сотни вкладок, 5 начатых репозиториев, ни одного завершённого.
Кажется, что ты в процессе… но на самом деле ты в болоте.
В психологии это состояние называют cognitive overload — когнитивная перегрузка.
(Sweller, J., Ayres, P., & Kalyuga, S. (2011). Cognitive Load Theory)
Ты берёшь на себя больше информации, чем способен обработать, и эффективность падает до нуля.
В IT это смертельно. Технологии бегут вперёд, а ты всё ещё бродишь по курсу «Java для начинающих» третий месяц без прогресса.
😞 Почему хаос убивает продуктивность
Нет границ
Удалёнка или самообучение = никто не скажет «стоп». В итоге либо работаешь до трёх ночи, либо растягиваешь одну задачу на весь день.
Потеря приоритетов
Вместо реальных задач ковыряешь шрифты в IDE, читаешь про новый фреймворк "на всякий случай". Это называется procrastination through busyness — прокрастинация через псевдозанятость.
(Pychyl, T. A., & Sirois, F. M. (2013). Procrastination, emotion regulation, and well-being)
Отсутствие ритма
Мозг — не хаотичная машина. Ему нужны циклы активности и отдыха (circadian rhythm). Без них ты превращаешься в сонного, раздражённого, медленного кодера.
‼️ Что же делать ‼️
😑 Разбивай путь на малые шаги. Строй планы, декомпозируй их на малые таски и стремись их выполнить.
И четко придерживайся плана. Чем точнее ты выполнишь задачу, уложившись в отведенное время, тем проще будет следующая.
Декомпозиция и обязательность - тоже навыки. Их тоже можно прокачать. Не пренебрегай ими.
🤨 Стань себе начальником. Заставь себя. Выстрели в свою лень.
Ставь задачи в календарь с точным временем.
Не что-то в голове, на уровне идей, а конкретика: в 19:00–20:30 — пишу код для pet-проекта.
И это время не двигается. Совсем.
😏 Одна задача = один фокус. Концентрация прокачивается. Строй вокруг себя условия, чтобы она не сбивалась.
Single-tasking — продуктивность падает, если переключаться между задачами.
Закрываешь IDE, чтобы на секундочку проверить почту - потерял 20–30% концентрации.
Делай одно дело за раз.
😐 Убери "проблему первого шага".
Хочешь учиться?
Сделай так, чтобы:
IDE уже была открыта
Курс уже загружен
Репозиторий уже клонирован
Это называется reducing activation energy — чем меньше действий до старта, тем выше шанс, что ты реально начнёшь.
(Oettingen, G., & Gollwitzer, P. M. (2010). Strategies of setting and implementing goals: Mental contrasting and implementation intentions. In Social Psychological Foundations of Clinical Psychology)
🤔 Почему это важно для айтишника
В офисе тебя могут спасать менеджеры, график, коллеги, которые напоминают о дедлайнах.
На удалёнке или при самообучении у тебя есть только Ты.
И если ты сам себе не начальник — значит, ты сам себе враг.
Самоорганизация — это не про мотивацию, а про систему. Мотивация придет позже.
Система = привычки, которые работают даже в дни, когда ты не хочешь работать.
Если не начнёшь ломать хаос сегодня — завтра он сломает тебя.
Поэтому, запланируй ответить мне в комментариях, что ты думаешь об это статье! Прокачай навык😉
Понравилась статья - поделись с другом, позови его на канал и будет тебе моя благодарность 🤝
😎
#motivation
Ты начал работать на удалёнке.
Никто не говорит тебе, когда начинать.
Хочешь — работай днём, хочешь — ночью. Важен только результат.
Звучит как мечта, да?
На самом деле — это ловушка.
Потому что без самоорганизации ты быстро превратишься в зомби, который "делает вид, что работает", а внутри тонет в хаосе.
"Можно быть умным, талантливым, даже иметь опыт.
Но без умения строить свой день и держать ритм — в долгую ты не вытянешь."
Курсы, видео, статьи, pet-проекты.
Сотни вкладок, 5 начатых репозиториев, ни одного завершённого.
Кажется, что ты в процессе… но на самом деле ты в болоте.
В психологии это состояние называют cognitive overload — когнитивная перегрузка.
(Sweller, J., Ayres, P., & Kalyuga, S. (2011). Cognitive Load Theory)
Ты берёшь на себя больше информации, чем способен обработать, и эффективность падает до нуля.
В IT это смертельно. Технологии бегут вперёд, а ты всё ещё бродишь по курсу «Java для начинающих» третий месяц без прогресса.
Нет границ
Удалёнка или самообучение = никто не скажет «стоп». В итоге либо работаешь до трёх ночи, либо растягиваешь одну задачу на весь день.
Потеря приоритетов
Вместо реальных задач ковыряешь шрифты в IDE, читаешь про новый фреймворк "на всякий случай". Это называется procrastination through busyness — прокрастинация через псевдозанятость.
(Pychyl, T. A., & Sirois, F. M. (2013). Procrastination, emotion regulation, and well-being)
Отсутствие ритма
Мозг — не хаотичная машина. Ему нужны циклы активности и отдыха (circadian rhythm). Без них ты превращаешься в сонного, раздражённого, медленного кодера.
И четко придерживайся плана. Чем точнее ты выполнишь задачу, уложившись в отведенное время, тем проще будет следующая.
Декомпозиция и обязательность - тоже навыки. Их тоже можно прокачать. Не пренебрегай ими.
Ставь задачи в календарь с точным временем.
Не что-то в голове, на уровне идей, а конкретика: в 19:00–20:30 — пишу код для pet-проекта.
И это время не двигается. Совсем.
Single-tasking — продуктивность падает, если переключаться между задачами.
Закрываешь IDE, чтобы на секундочку проверить почту - потерял 20–30% концентрации.
Делай одно дело за раз.
Хочешь учиться?
Сделай так, чтобы:
IDE уже была открыта
Курс уже загружен
Репозиторий уже клонирован
Это называется reducing activation energy — чем меньше действий до старта, тем выше шанс, что ты реально начнёшь.
(Oettingen, G., & Gollwitzer, P. M. (2010). Strategies of setting and implementing goals: Mental contrasting and implementation intentions. In Social Psychological Foundations of Clinical Psychology)
В офисе тебя могут спасать менеджеры, график, коллеги, которые напоминают о дедлайнах.
На удалёнке или при самообучении у тебя есть только Ты.
И если ты сам себе не начальник — значит, ты сам себе враг.
Самоорганизация — это не про мотивацию, а про систему. Мотивация придет позже.
Система = привычки, которые работают даже в дни, когда ты не хочешь работать.
Если не начнёшь ломать хаос сегодня — завтра он сломает тебя.
Поэтому, запланируй ответить мне в комментариях, что ты думаешь об это статье! Прокачай навык
#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2 1