Java for Beginner
717 subscribers
661 photos
174 videos
12 files
1.03K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Built-in плагины

Gradle поставляется с набором встроенных плагинов, которые покрывают стандартные сценарии сборки.

java:
Добавляет задачи для компиляции, тестирования и упаковки Java-проектов (например, compileJava, test, jar).

Пример:
plugins {
id 'java'
}


В памяти: Загружает задачи и конфигурации (implementation, testImplementation), увеличивая модель проекта (50-100 МБ).


application:
Добавляет задачи для запуска Java-приложений (run, installDist).

Пример:
plugins {
id 'application'
}
application {
mainClass = 'com.example.Main'
}


В памяти: Добавляет задачи и classpath, минимально увеличивая overhead.


base:
Базовый плагин, добавляющий задачи жизненного цикла (clean, assemble, check).

Пример:
plugins {
id 'base'
}

В памяти: Легковесный, добавляет минимальное количество задач.


java-library:
Расширяет java, добавляя конфигурации api и implementation для библиотек.

Пример:

plugins {
id 'java-library'
}
dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
}

В памяти: Увеличивает граф зависимостей за счет дополнительных конфигураций.


checkstyle:
Интегрирует проверку стиля кода с помощью Checkstyle.

Пример:
plugins {
id 'checkstyle'
}
checkstyle {
toolVersion = '8.45'
configFile = file('config/checkstyle/checkstyle.xml')
}

В памяти: Загружает конфигурацию Checkstyle и отчеты, увеличивая потребление памяти (50-100 МБ для крупных проектов).


maven-publish:

Позволяет публиковать артефакты в Maven-репозитории.

Пример:
plugins {
id 'maven-publish'
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
repositories {
maven {
url 'https://nexus.example.com/repository/maven-releases'
}
}
}

В памяти: Загружает метаданные публикации и артефакты, увеличивая overhead при публикации.



#Java #middle #Gradle #Task #Plugin
👍2
Плагины для Kotlin, Android

Kotlin:
Плагин org.jetbrains.kotlin.jvm для JVM-проектов или org.jetbrains.kotlin.android для Android.

Пример:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.9.0'
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.9.0'
}

В памяти: Загружает Kotlin-компилятор и зависимости, добавляя 100-200 МБ overhead.


Android:

Плагин com.android.application или com.android.library для Android-проектов.

Пример:
plugins {
id 'com.android.application' version '8.1.0'
id 'org.jetbrains.kotlin.android' version '1.9.0'
}
android {
compileSdk 33
defaultConfig {
applicationId 'com.example.app'
minSdk 21
targetSdk 33
versionCode 1
versionName '1.0'
}
}

В памяти: Android-плагины загружают Android SDK, инструменты сборки (dexer, aapt2) и зависимости, что может потребовать 500-1000 МБ памяти.



Создание собственных плагинов

Собственные плагины позволяют кастомизировать сборку. Они могут быть написаны на Groovy, Kotlin или Java.

Плагин на Groovy

Создайте проект с структурой:
my-plugin/
├── src/main/groovy/com/example/MyPlugin.groovy
├── build.gradle


Реализуйте плагин:
package com.example
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.tasks.register('myTask') {
doLast {
println 'Hello from MyPlugin!'
}
}
}
}


Настройте build.gradle:
plugins {
id 'groovy'
id 'maven-publish'
}
group = 'com.example'
version = '1.0'
publishing {
publications {
maven(MavenPublication) {
from components.java
}
}
}


Опубликуйте:
./gradlew publish.

В памяти: Groovy-плагины загружают Groovy-библиотеки, добавляя 50-100 МБ overhead.



Плагин на Kotlin

Создайте проект:
my-plugin/
├── src/main/kotlin/com/example/MyPlugin.kt
├── build.gradle.kts


Реализуйте плагин:
package com.example
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.tasks.register("myTask") {
doLast {
println("Hello from MyPlugin!")
}
}
}
}


Настройте build.gradle.kts:
plugins {
`kotlin-dsl`
`maven-publish`
}
group = "com.example"
version = "1.0"
publishing {
publications {
create<MavenPublication>("maven") {
from(components["java"])
}
}
}


Опубликуйте:
./gradlew publish.

В памяти: Kotlin-плагины загружают Kotlin-библиотеки, добавляя 50-100 МБ overhead, но обеспечивают строгую типизацию.


Плагин на Java

Аналогично, но используйте Java-классы:
package com.example;
import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getTasks().register("myTask", task -> {
task.doLast(t -> System.out.println("Hello from MyPlugin!"));
});
}
}

В памяти: Java-плагины легче, чем Groovy/Kotlin, так как не требуют дополнительных библиотек DSL.



Публикация плагина
Опубликуйте в локальный репозиторий:
./gradlew publishToMavenLocal


Используйте в другом проекте:
plugins {
id 'com.example.my-plugin' version '1.0'
}



#Java #middle #Gradle #Task #Plugin
👍2
Gradle Plugin Portal

Gradle Plugin Portal (plugins.gradle.org) — центральный репозиторий для публикации и загрузки плагинов.

Публикация:
Зарегистрируйтесь на plugins.gradle.org.
Получите API-ключ.


Настройте build.gradle:
plugins {
id 'com.gradle.plugin-publish' version '1.2.0'
}
pluginBundle {
plugins {
myPlugin {
id = 'com.example.my-plugin'
displayName = 'My Plugin'
description = 'A custom Gradle plugin'
tags = ['custom', 'example']
version = '1.0'
}
}
}


Опубликуйте:
./gradlew publishPlugins.


Использование:
plugins {
id 'com.example.my-plugin' version '1.0'
}

В памяти: Gradle Plugin Portal загружает метаданные плагинов в память при разрешении, добавляя небольшой overhead (10-50 МБ).


Plugin Resolution Strategy

Gradle разрешает плагины из репозиториев, указанных в pluginManagement или buildscript.

Стратегия разрешения:
Поиск: Gradle ищет плагин в Gradle Plugin Portal, Maven Central или пользовательских репозиториях.
Конфликты: Если плагин доступен в нескольких версиях, Gradle выбирает новейшую или указанную версию.


Настройка:
configurations.all {
resolutionStrategy {
force 'com.example:my-plugin:1.0'
}
}

В памяти: Разрешение плагинов загружает их метаданные и зависимости в память, аналогично зависимостям проекта.


pluginManagement в settings.gradle

Блок pluginManagement в settings.gradle позволяет централизованно управлять плагинами для всех модулей.

Пример:
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral()
}
plugins {
id 'org.springframework.boot' version '2.7.18'
}
}


Kotlin DSL:
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral()
}
plugins {
id("org.springframework.boot") version "2.7.18"
}
}


Назначение:
Указывает репозитории для плагинов.
Фиксирует версии плагинов для всех модулей.


Поддерживает кастомные разрешения:

pluginManagement {
resolutionStrategy {
eachPlugin {
if (requested.id.id == 'com.example.my-plugin') {
useModule('com.example:my-plugin:1.0')
}
}
}
}

В памяти: pluginManagement загружает метаданные плагинов во время инициализации, добавляя минимальный overhead (10-30 МБ), но обеспечивая согласованность версий.



Нюансы и внутренние механизмы

Управление памятью:
Плагины загружаются как Java-классы в JVM, включая их зависимости. Крупные плагины (например, android) могут добавлять 500-1000 МБ overhead.
Скриптовые плагины парсятся как Groovy/Kotlin-скрипты, увеличивая потребление памяти из-за динамической компиляции.
Оптимизируйте с помощью pluginManagement для централизованного управления и минимизации дублирования.


Кэширование:
Плагины и их зависимости кэшируются в ~/.gradle/caches/modules-2, снижая сетевые запросы.
Очистка кэша:
rm -rf ~/.gradle/caches.


Производительность:
plugins {} быстрее, чем apply plugin:, за счет оптимизированного разрешения.
Параллельное выполнение задач (--parallel) ускоряет сборку, но увеличивает пиковое потребление памяти.
Используйте --configure-on-demand для сокращения времени конфигурации.


Отладка:
Используйте --info или --debug для анализа загрузки плагинов:
./gradlew build --debug


Проверьте список задач:
./gradlew tasks --all.


Build Scans (--scan) показывают влияние плагинов на сборку.

Совместимость:

Убедитесь, что плагины совместимы с версией Gradle (например, Android-плагины требуют Gradle 7.0+).
Используйте JAVA_HOME с JDK 8+ (рекомендуется 11+).


Безопасность:
Храните учетные данные для репозиториев в ~/.gradle/gradle.properties с ограниченными правами (chmod 600).
Проверяйте плагины из Gradle Plugin Portal на наличие GPG-подписей.


#Java #middle #Gradle #Task #Plugin
👍2
Что выведет код?

import java.util.concurrent.*;

public class Task310725 {
public static void main(String[] args) throws Exception {
Callable<String> task = () -> "Result";
FutureTask<String> future = new FutureTask<>(task);

new Thread(future).start();
System.out.println(future.get());
}
}


#Tasks
👍4
Карточка для запоминания short 😎

#memory_card
👍5
Что такое ReadWriteLock? 🤓

Ответ:

ReadWriteLock разделяет доступ на чтение и запись, позволяя множественным потокам читать одновременно, но только одному записывать.

Пример:
ReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock().lock();
try {
// Чтение данных
} finally {
lock.readLock().unlock();
}

Увеличивает производительность при частом чтении.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Факт дня:

А вы знали, что первый компьютерный "онлайн-магазин музыки" был запущен в 1999 году?

MP3.com, запущенный в 1999 году, позволял загружать и покупать цифровую музыку. Он опередил iTunes, но закрылся из-за проблем с авторскими правами.

proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
ℹ️ Кто родился в этот день

Зиновий Львович Рабинович (род. 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 с базовой структурой:
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 (число с плавающей точкой).

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
Что выведет код?

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
Карточка для запоминания int 😎

#memory_card
👍2🔥1
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓

Голосуем за тему к рассмотрению в эти выходные!

Предлагаем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)

Не стесняемся! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Что такое Condition в Java? 🤓

Ответ:

Condition (используется с Lock) предоставляет аналог wait() и notify() для более гибкой синхронизации.

Пример:
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
3👍1
ℹ️ Кто родился в этот день

Сергей Михайлович Белоусов (род. 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
После проведенного голосования, с выбрана тема - JWT (JSON Web Token)

Ну читаем'с ниже статейку

Ранее мы рассматривали эту тему, но сейчас более развернуто.

Если нужно рассмотреть эту тему более подробно - пишите в комментах, буду готовить 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
Обзор 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:
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
👍4