Java библиотека
Привет! Добро пожаловать на Telegram канал "Java библиотека"! Здесь вы найдете множество полезных ресурсов для Java программистов. Мы предлагаем книги, статьи, мемы и многое другое, чтобы помочь вам углубиться в мир Java программирования.
Присоединяйтесь к нам, чтобы получать самую свежую информацию и делиться опытом с другими Java разработчиками. Наш канал предлагает разнообразные материалы, которые помогут вам расширить свои знания и навыки в Java.
Публикации канала
Webhook: подписывайте исходные байты запроса Для HMAC-SHA256 сервер вычисляет MAC по исходному телу и общему секрету, затем сравнивает результат с присланной подписью. В Java используются Mac.getInstance("HmacSHA256") и SecretKeySpec. Для сравнения байтовых массивов подходит MessageDigest.isEqual(expected, provided). Важны детали протокола: секрет может быть строкой или Base64-данными, а подпись — hex либо Base64. Декодируйте именно тот формат, который задаёт отправитель. Не пересобирайте JSON перед проверкой: пробелы и порядок полей меняют байты. Некорректный формат подписи должен приводить к отказу до обработки события. HMAC не предотвращает повторную доставку. Для этого отдельно нужны правила проверки времени или учёт идентификаторов событий. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
unmodifiableList: представление, а не снимок var source = new ArrayList<>(List.of("A")); var view = Collections.unmodifiableList(source); var snapshot = List.copyOf(source); source.add("B"); System.out.println(view); // [A, B] System.out.println(snapshot); // [A] Обёртка запрещает изменение списка через view, но показывает изменения исходного списка. List.copyOf(), доступный с Java 10, создаёт независимый по составу неизменяемый список и не принимает null-элементы. Копия поверхностная: изменяемые объекты внутри неё остаются теми же объектами. При возврате данных из сервиса решите, нужен читателю текущий вид коллекции или снимок на момент вызова. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Java библиотека pinned «»
Загрузчик классов — часть идентичности типа Для JVM класс определяется не только именем, но и загрузчиком, который его определил. Два одноимённых класса из разных загрузчиков могут оказаться несовместимыми типами. В типичной современной JVM есть bootstrap, platform и application class loader. Пользовательский загрузчик может добавлять свой способ поиска классов. При стандартной делегации родителю дочерний загрузчик видит классы родителей; обратная видимость автоматически не появляется. Это важно для плагинов: общий интерфейс должен загружаться так, чтобы обе стороны действительно использовали один тип. Конкретная схема может отличаться от стандартной, например в контейнерах и системах плагинов. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥 ✅ 29 октября, четверг, 19:00 (мск) — приходите на митап в Санкт-Петербурге или смотрите трансляцию. Спикеры из ЮMoney и Сбера выступят с докладами: 🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления. 🟣 Как я автоматизировал свой проект — и всё сломал Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей. 🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате. Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈
Безопасность Java: десять проверок перед релизом 1. Проверяйте входные данные и отдельно права на действие. Валидация не заменяет авторизацию. 2. Передавайте SQL-значения параметрами PreparedStatement. Имена таблиц и колонок выбирайте из разрешённого набора. 3. Не отдавайте клиенту stack trace и внутреннюю конфигурацию. 4. Храните секреты вне репозитория, определите способ их ротации. 5. Проверяйте доступ к конкретному объекту, а не только роль пользователя. 6. Ограничивайте десериализуемые типы. JSON сам по себе не гарантирует безопасность. 7. Следите за уязвимостями и обновлениями зависимостей. 8. Не записывайте пароли и токены в логи. 9. Настройте Secure, HttpOnly и подходящий SameSite для сессионных cookie. 10. Проверьте защитные заголовки и CSP под конкретный интерфейс. Настройки нужно проверять вместе с поведением приложения, а не только наличием аннотаций. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Почему GC не устраняет все утечки памяти GC освобождает память объектов, которые больше недостижимы. Если приложение продолжает хранить ненужную ссылку, сборщик не может угадать, что объект больше не нужен бизнес-логике. Проверьте: • статическую коллекцию, в которую только добавляют элементы; • кеш без ограничений или удаления записей; • ThreadLocal в долгоживущем потоке; • слушателя, который остаётся зарегистрированным после закрытия экрана или сессии. Для поиска причины полезны heap dump и пути удержания объектов от GC roots. Сам рост занятой памяти ещё не доказывает утечку: смотрите, что удерживается после сборок и почему. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
InterruptedException: не теряйте запрос отмены sleep(), wait(), join() и некоторые операции блокирующих очередей могут выбросить InterruptedException. При этом флаг прерывания обычно сбрасывается. Если ваш метод не умеет обработать отмену, передайте исключение выше. Если сигнатура этого не позволяет, например в Runnable.run(), восстановите флаг и завершите задачу: catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } Важное отличие: LockSupport.park() не выбрасывает InterruptedException. После возврата нужно проверять состояние и условие ожидания. Thread.interrupted() читает и сбрасывает флаг текущего потока, а isInterrupted() только читает. Выбор метода влияет на дальнейшую обработку отмены. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Форматирование строк: читаемость и Locale Когда сообщение содержит несколько значений, шаблон помогает отделить структуру от данных: String message = String.format( "Пользователь %s оформил %d заказов", name, orderCount ); Для чисел с дробной частью результат может зависеть от Locale. Если это машинный формат, задавайте Locale явно. Для пользовательского текста подбирайте локаль пользователя. MessageFormat полезен для шаблонов локализуемых сообщений, но у него собственные правила экранирования. Простая конкатенация остаётся нормальным решением. Выбирать format ради обещанного ускорения не стоит. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Критическая уязвимость в Java: атака по сети без пароля и участия пользователя Oracle опубликовала предупреждение CVE-2026-91403 с оценкой CVSS 9.1. Проблема находится в JSSE — компоненте Java, который обеспечивает защищённые соединения TLS. По описанию Oracle, успешная атака может позволить читать, изменять и удалять данные, доступные уязвимому приложению. Для эксплуатации не нужны учётные данные, а сложность атаки оценена как низкая. В списке затронутых версий: - Java SE 8u511 / 8u511-perf, 11.0.33, 17.0.21, 21.0.13, 25.0.5 и 27.0.1. - Oracle GraalVM for JDK 17.0.21 и 21.0.13. - Oracle GraalVM Enterprise Edition 21.3.20. Условия зависят от приложения: Oracle указывает на сценарии, где данные атакующего попадают в API уязвимого компонента, например через веб-сервис. Само наличие Java ещё не означает, что любой сервис можно атаковать. Администраторам стоит проверить используемые сборки Java, включая runtime внутри контейнеров, и установить исправления по инструкции поставщика. Предупреждение опубликовано 21 октября. Более ранние версии тоже могут быть затронуты — отсутствие в списке не подтверждает их безопасность. https://www.oracle.com/security-alerts/alert-cve-2026-91403.html Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
CSV: запятая внутри значения меняет правила Простое String.join(",", values) не подходит, если поля содержат кавычки, запятые или переносы строк. Один возможный способ экранирования: static String csv(String value) { if (value.contains(",") || value.contains("\"") || value.contains("\n") || value.contains("\r")) { return "\"" + value.replace("\"", "\"\"") + "\""; } return value; } Здесь null не допускается: способ записи отсутствующего значения нужно определить отдельно. Для обмена с другими программами согласуйте кодировку, разделитель и окончания строк. Если CSV откроют в таблице, отдельно учитывайте формулы: обычное CSV-экранирование не защищает от интерпретации значений вроде =... как формул. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
🔥 Прожарка резюме Java-разработчиков Откликаешься, а в ответ тишина? Или зовут, но предлагают меньше, чем рассчитываешь? Возможно, дело не в навыках, а в резюме. 27 октября рекрутер из Skyeng и Java-разработчик из Wildberries разберут резюме участников в прямом эфире! Что разберём: ✦ почему рекрутер закрывает резюме, не дочитав до конца; ✦ как показать свой вклад и результаты, а не просто перечислить технологии; ✦ какие формулировки могут занизить твой грейд. 🗓 27 октября в 19:00 МСК Участие бесплатное 👥 Спикеры: — Анастасия Дегтярь, Senior TA в Skyeng, 6+ лет в найме; — Виктор Анохин, Java/Kotlin-разработчик в Wildberries, ex-Билайн. Эфир проводит ШОРТКАТ – менторская программа для разработчиков, которые хотят сменить работу или вырасти в грейде и зарплате. Переходи в бота, чтобы зарегистрироваться на эфир: @shortcut_sh_bot Реклама. О рекламодателе.
requireNonNull — явная проверка, а не магия типов Objects.requireNonNull проверяет ссылку во время выполнения и бросает NullPointerException с заданным сообщением: this.repository = Objects.requireNonNull( repository, "repository" ); Метод существует с Java 7. Он не делает типы Java автоматически null-безопасными и не проверяет поля объекта рекурсивно. @NotNull и @Nullable описывают контракт для анализатора или фреймворка. Чтобы получить проверку на входе HTTP-метода через Bean Validation, нужна соответствующая интеграция. Lombok @NonNull может сгенерировать проверку при обработке аннотаций — это другой механизм. Выбирайте его осознанно, а не как свойство JVM. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
🗄 Вебинар: JDBC: как Java-приложения взаимодействуют с базами данных JDBC позволяет Java-приложениям работать с базами данных. Разберём подключение, SQL-запросы, транзакции и обработку ошибок. 💬 О чём поговорим - Как подключиться к СУБД с помощью DriverManager и работать с Connection. - Как выполнять SQL-запросы через Statement и PreparedStatement и получать результаты через ResultSet. - Как управлять транзакциями: autocommit, commit и rollback. - Как использовать SQLException, чтобы разобраться в причинах ошибки при выполнении запроса. 🎯 Результат урока: - Вы разберётесь, как подключать Java-приложение к СУБД, выполнять SQL-запросы и работать с результатами. - Узнаете, как управлять транзакциями и обрабатывать ошибки при обращении к базе данных. 👉 Для участия зарегистрируйтесь: https://vk.cc/d3hffx Вебинар проходит в рамках старта курса «Java-разработчик», который помогает освоить современную Java-разработку: от основ и первых программ до серверных приложений, баз данных, Spring, контейнеров и очередей сообщений. Программа регулярно обновляется под требования рынка. 🚀 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Остановка задачи: interrupt требует сотрудничества interrupt() не убивает поток. Он сообщает задаче о запросе отмены. Код должен проверять этот сигнал или корректно выходить из прерываемой операции. Для рабочего цикла с ожиданием: try { while (!Thread.currentThread().isInterrupted()) { doWork(); Thread.sleep(500); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); // выходим из задачи } Если восстановить флаг и сразу продолжить прежний бесконечный цикл, следующий sleep может немедленно бросить исключение. Нужен выход или явная политика продолжения. Thread.stop() не используйте: в Java 25 этот метод ещё объявлен, но всегда выбрасывает UnsupportedOperationException. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Чем отличаются Web server и Application server? Web Server (веб-сервер) обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения). Application Server (сервер приложений) запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных. Web Server (веб-сервер) Принимает HTTP-запросы от браузера. Отдает статические файлы (HTML, CSS, JS, картинки). Может перенаправлять запросы к Application Server. Apache HTTP Server Nginx Microsoft IIS Допустим, пользователь открывает сайт example.com/index.html: Браузер отправляет HTTP-запрос: GET /index.html HTTP/1.1 Host: example.com Веб-сервер (например, Nginx) получает запрос и отправляет браузеру файл index.html. Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту. Application Server (сервер приложений) Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД). Выполняет Java-код (Servlet, EJB, Spring, Hibernate). Может генерировать HTML-страницы на сервере (JSP, Thymeleaf). Управляет транзакциями и соединениями с базой данных. Tomcat (самый популярный в мире Java-сервер) WildFly (JBoss) GlassFish WebLogic, WebSphere Допустим, пользователь заходит на example.com/login: Браузер отправляет HTTP-запрос: POST /login HTTP/1.1 Host: example.com Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
👩💻 Что ломается при переходе на Spring Boot 4 После обновления проект может успешно компилироваться и проходить тесты, а затем упасть уже при запуске. Авторы разбирают реальные проблемы миграции: Jackson 2/3, старые коннекторы, Feign, Security 7, JUnit 6 и изменившиеся автоконфигурации. ⛓ Читать статью Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Большинство воспринимает Spring Boot просто как фреймворк для создания REST API. Но за ним скрывается гораздо более крупная экосистема • Spring Core и внедрение зависимостей • Spring MVC и WebFlux • JPA, Hibernate и базы данных • Безопасность с JWT и OAuth 2.0 • Kafka и RabbitMQ • Redis и распределённое кэширование • Docker, Kubernetes и облачные платформы • Мониторинг с Actuator, Prometheus и Grafana Spring Boot упрощает настройку проекта, а понимание всех стоящих за ним уровней помогает стать сильнее как бэкенд-разработчик. Фреймворк позволяет быстро начать работу. Экосистема помогает создавать приложения для продакшена. Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
ETag: ответ 304 работает только вместе с кешем Клиент сохраняет тело успешного ответа и его ETag. При следующем запросе он может передать метку в If-None-Match. • 304 — ресурс не изменился; используйте уже сохранённое тело. Нового тела в таком ответе нет. • 200 — сохраните новое тело и новую метку. Если ETag отсутствует, старую метку нужно сбросить. • Другие статусы обрабатываются отдельно; это не успешное обновление кеша. Отправлять If-None-Match имеет смысл, когда есть и метка, и соответствующее тело. Храните их согласованно. Для полноценного HTTP-кеша также важны Cache-Control, Vary и ключ кеша. Один ETag не реализует все правила кеширования. #Java Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Комментарии
Комментариев пока нет
Комментарии пишут вошедшие — так видно, кто автор.
Войти