Java | Вопросы собесов
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+icUwivvbGOkwNWRi Задачи t.me/+8eqUTboisnkyZjQy Вакансии t.me/+4pspF5nDjgM4MjQy
Больше📈 Аналитический обзор Telegram-канала Java | Вопросы собесов
Канал Java | Вопросы собесов (@easy_java_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 11 459 подписчиков, занимая 10 895 место в категории Технологии и приложения и 57 420 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 11 459 подписчиков.
Согласно последним данным от 11 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 11, а за последние 24 часа — 3, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 10.83%. В первые 24 часа после публикации контент обычно набирает 7.26% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 241 просмотров. В течение первых суток публикация набирает 832 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 6.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, void, string, строка, static.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Тесты t.me/+icUwivvbGOkwNWRi
Задачи t.me/+8eqUTboisnkyZjQy
Вакансии t.me/+4pspF5nDjgM4MjQy”
Благодаря высокой частоте обновлений (последние данные получены 12 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
sessionId и значением 12345.
2️⃣ Домен и путь: Указывают, к какому домену и пути относится cookie. Например, cookie, установленное для домена example.com, будет доступно для всех поддоменов, если не указано иное.
3️⃣ Время жизни: Указывает, как долго cookie должно храниться. Может быть сессионным (удаляется после закрытия браузера) или постоянным (с заданным временем истечения).
4️⃣ Безопасность: Cookies могут быть помечены как Secure (отправляются только через HTTPS) и HttpOnly (недоступны для JavaScript, что повышает безопасность).
Примеры:
Установка
В сервлетах для установки cookies используется класс Cookie и методы HttpServletResponse.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/setCookie")
public class SetCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Создание cookies
Cookie cookie = new Cookie("username", "JohnDoe");
cookie.setMaxAge(60 * 60); // Установить время жизни в секундах (1 час)
response.addCookie(cookie); // Добавить cookie в ответ
response.getWriter().println("Cookie set successfully");
}
}
Чтение
Для этого сервлетах используется метод getCookies класса HttpServletRequest.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
String username = cookie.getValue();
response.getWriter().println("Hello, " + username);
}
}
} else {
response.getWriter().println("No cookies found");
}
}
}
Атрибуты
➕ Name (Имя): Имя cookie, используемое для его идентификации.
➕ Value (Значение): Значение cookie.
➕ Domain (Домен): Домен, для которого cookie действительно.
➕ Path (Путь): Путь на сервере, для которого cookie действительно.
➕ Max-Age (Максимальный возраст): Время жизни cookie в секундах.
➕ Secure (Безопасный): Если установлен, cookie передается только по HTTPS.
➕ HttpOnly: Если установлен, cookie недоступно для JavaScript через document.cookie.
Cookies — это небольшие фрагменты данных, отправляемые сервером и хранимые на клиентской стороне, используемые для сохранения информации между запросами. Они полезны для поддержания состояния сеансов, хранения пользовательских предпочтений и аналитики, но имеют ограничения по размеру и могут представлять угрозу безопасности и конфиденциальности.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовыхHttpSession, который создается или извлекается из запроса.
➕ Пример использования:
// Получение текущей сессии или создание новой, если она не существует
HttpSession session = request.getSession(true);
// Установка атрибута в сессии
session.setAttribute("username", "JohnDoe");
// Получение атрибута из сессии
String username = (String) session.getAttribute("username");
// Инвалидизация сессии
session.invalidate();
➕ Преимущества: Удобство использования, интеграция с контейнером сервлетов, поддержка различных механизмов хранения (в памяти, в базе данных и т.д.).
➕ Недостатки: Зависимость от сервера, может быть проблематично в распределенных системах.
2️⃣ URL Rewriting (перезапись URL):
➕ Метод, при котором идентификатор сессии передается в URL.
➕ Реализация: Включает идентификатор сессии в каждый URL, генерируемый сервером.
- // Получение идентификатора сессии и включение его в URL
String encodedURL = response.encodeURL("http://example.com/page");
➕ Преимущества: Работает, даже если у клиента отключены cookies.
➕ Недостатки: Менее безопасный, так как идентификатор сессии виден в URL и может быть перехвачен.
3️⃣ Cookies:
➕ Использование HTTP-кокисов для хранения идентификатора сессии на стороне клиента.
➕ Реализация: Сервлеты могут читать и записывать cookies через объекты HttpServletRequest и HttpServletResponse.
- // Создание и добавление cookies
Cookie cookie = new Cookie("sessionId", "12345");
cookie.setMaxAge(60*60); // Установка времени жизни в секундах
response.addCookie(cookie);
// Чтение cookies
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
if ("sessionId".equals(c.getName())) {
String sessionId = c.getValue();
}
}
➕ Преимущества: Широко поддерживается, позволяет сохранять небольшие объемы данных на клиенте.
➕ Недостатки: Зависимость от клиента (клиенты могут отключать cookies), ограниченный объем хранения данных.
4️⃣ Hidden Form Fields (скрытые поля формы):
➕ Метод передачи данных сессии через скрытые поля HTML-формы.
➕ Реализация: Идентификатор сессии включается в скрытые поля формы, которые отправляются на сервер при каждом запросе.
- <form action="/submit" method="post">
<input type="hidden" name="sessionId" value="12345">
<input type="submit" value="Submit">
</form>
➕ Преимущества: Работает независимо от cookies.
➕ Недостатки: Требует изменения всех форм в приложении, не подходит для ссылок.
Важные моменты
1️⃣ Безопасность:
➕ При использовании URL Rewriting или Hidden Form Fields идентификатор сессии может быть легче перехвачен. Поэтому необходимо использовать HTTPS для шифрования данных.
➕ Важно инвалидировать сессию после выхода пользователя из системы для предотвращения кражи сессии.
2️⃣ Сохранение состояния:
➕ Не храните в сессии большие объемы данных. Используйте сессии для хранения небольших, но часто используемых данных (например, идентификатор пользователя).
3️⃣ Распределенные системы:
➕ В распределенных системах используйте решения, поддерживающие кластеризацию сессий, такие как базы данных или распределенные кэши (например, Redis).
Основные методы управления сессиями в сервлетах включают использование HTTP-сессий (HttpSession), перезапись URL (URL Rewriting), cookies и скрытые поля формы (Hidden Form Fields). Каждый метод имеет свои преимущества и недостатки, и выбор зависит от конкретных требований вашего приложения.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых?, &, #). URL encoding заменяет небезопасные символы на их процент-кодированные эквиваленты.
Основные моменты:
1️⃣ Символы, подлежащие кодированию:
➕ Символы, которые не входят в набор безопасных символов ASCII: пробелы, специальные символы, такие как &, ?, /, и не-ASCII символы.
➕ Пробелы кодируются как %20 или +.
➕ Специальные символы заменяются на их шестнадцатеричные представления, предшествуемые знаком процента (%).
2️⃣ Примеры кодирования:
➕ Пробел ( ) → %20 или +
➕ Символ амперсанда (&) → %26
➕ Символ вопросительного знака (?) → %3F
➕ Символ решетки (#) → %23
Пример URL encoding
Вручную:
Оригинальный URL: https://www.example.com/search?query=hello world&category=books
Закодированный URL: https://www.example.com/search?query=hello%20world&category=books
Осуществление URL encoding
Предоставляет классы и методы для выполнения URL encoding. Наиболее часто используемые из них - это URLEncoder и URLDecoder.
Использование класса URLEncoder
Используется для кодирования URL-строк.
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class UrlEncodingExample {
public static void main(String[] args) {
try {
String originalUrl = "https://www.example.com/search?query=hello world&category=books";
String query = "hello world";
String category = "books";
// Кодирование параметров запроса
String encodedQuery = URLEncoder.encode(query, "UTF-8");
String encodedCategory = URLEncoder.encode(category, "UTF-8");
// Формирование закодированного URL
String encodedUrl = "https://www.example.com/search?query=" + encodedQuery + "&category=" + encodedCategory;
System.out.println("Закодированный URL: " + encodedUrl);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
Использование класса URLDecoder
Используется для декодирования URL-строк.
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class UrlDecodingExample {
public static void main(String[] args) {
try {
String encodedUrl = "https://www.example.com/search?query=hello%20world&category=books";
// Извлечение и декодирование параметров запроса
String encodedQuery = "hello%20world";
String encodedCategory = "books";
String decodedQuery = URLDecoder.decode(encodedQuery, "UTF-8");
String decodedCategory = URLDecoder.decode(encodedCategory, "UTF-8");
System.out.println("Декодированный query: " + decodedQuery);
System.out.println("Декодированная category: " + decodedCategory);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
Важные моменты
1️⃣ Кодировка:
➕ Убедитесь, что используете правильную кодировку (обычно UTF-8), чтобы избежать проблем с несовместимостью символов.
2️⃣ Кодирование только параметров:
➕ Кодируйте только значения параметров, а не весь URL. Например, в https://www.example.com/search?query=hello world, кодируйте только hello world.
URL encoding используется для преобразования специальных символов в URL в безопасный для передачи формат. Это можно сделать с помощью классов URLEncoder и URLDecoder. Кодирование необходимо для правильной передачи данных через URL и предотвращения проблем с интерпретацией символов на сервере.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовыхSingleThreadModel предназначался для обеспечения потокобезопасности сервлетов. Он определял, что каждый запрос к сервлету должен обрабатываться отдельным потоком, чтобы предотвратить проблемы, связанные с многопоточностью. Однако, этот интерфейс устарел и более не рекомендуется к использованию.
Особенности и причины устаревания
1️⃣ Обеспечение потокобезопасности:
➕ Интерфейс SingleThreadModel гарантировал, что сервлет будет обслуживать только один запрос за раз. Это означало, что для каждого запроса создавался новый экземпляр сервлета или использовался пул экземпляров.
2️⃣ Проблемы производительности:
➕ Создание нового экземпляра сервлета для каждого запроса или использование пула экземпляров значительно снижает производительность и увеличивает использование памяти. Это особенно проблематично для приложений с высоким уровнем параллелизма и большим числом одновременных запросов.
3️⃣ Устаревание и удаление:
➕ Интерфейс SingleThreadModel был объявлен устаревшим начиная с версии Servlet API 2.4. В современных приложениях использование этого интерфейса не рекомендуется, и он был удален в последних версиях спецификации сервлетов.
➕ Вместо использования SingleThreadModel рекомендуется писать потокобезопасные сервлеты, используя стандартные техники синхронизации и избегая хранения состояния в полях сервлета.
Альтернативы и рекомендации
1️⃣ Потокобезопасное программирование:
➕ Используйте локальные переменные метода вместо полей класса для хранения данных, специфичных для запроса.
➕ Синхронизируйте доступ к общим ресурсам, если необходимо.
2️⃣ Использование атрибутов запроса и сессии:
➕ Храните данные, специфичные для запроса, в атрибутах объекта HttpServletRequest.
➕ Храните данные, специфичные для сессии пользователя, в атрибутах объекта HttpSession.
3️⃣ Современные фреймворки:
➕ Современные веб-фреймворки и спецификации (например, Spring MVC, Jakarta EE) предоставляют средства для упрощения создания потокобезопасных веб-приложений и управления состоянием.
Пример потокобезопасного сервлета
Вместо использования SingleThreadModel, вы можете сделать ваш сервлет потокобезопасным, избегая использования полей экземпляра для хранения данных запроса.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/safeServlet")
public class SafeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Использование локальных переменных метода для хранения данных запроса
String param = request.getParameter("param");
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
response.getWriter().println("<html><body>");
response.getWriter().println("<h1>Parameter: " + param + "</h1>");
response.getWriter().println("</body></html>");
}
}
Интерфейс SingleThreadModel устарел и не рекомендуется к использованию в современных сервлетах. Вместо этого следует использовать стандартные техники потокобезопасного программирования, такие как использование локальных переменных метода и синхронизация доступа к общим ресурсам, чтобы обеспечить корректную работу многопоточных веб-приложений.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовыхPrintWriter и ServletOutputStream в одном и том же ответе сервлета нельзя. Попытка это сделать приведет к исключению IllegalStateException. Это связано с тем, что HTTP-ответ может быть либо текстовым, либо бинарным, но не одновременно обоими.
Ограничения
1️⃣ Взаимоисключение потоков:
➕ Внутри HttpServletResponse использование метода getWriter() блокирует использование метода getOutputStream() и наоборот. Это делается для предотвращения конфликтов между двумя потоками вывода, которые могли бы привести к некорректной отправке данных клиенту.
2️⃣ Тип содержимого:
➕ В HTTP-ответе должен быть четко указан тип содержимого (Content-Type). Использование двух различных потоков вывода может привести к несоответствию типов содержимого и нарушить целостность данных.
Пример, когда происходит ошибка
@WebServlet("/invalidServlet")
public class InvalidServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Попытка сначала получить PrintWriter
PrintWriter writer = response.getWriter();
writer.println("This is a text response.");
// Затем получить ServletOutputStream приведет к ошибке
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(new byte[]{1, 2, 3});
}
}
Правильное использование
Должны выбрать один из методов в зависимости от типа данных, которые вы хотите отправить в ответе.
Отправка текстового ответа
Используйте PrintWriter для отправки текстовых данных, таких как HTML, JSON или XML.
@WebServlet("/textResponse")
public class TextResponseServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello, World!</h1>");
out.println("</body></html>");
}
}
Отправка бинарного ответа
Используйте ServletOutputStream для отправки бинарных данных, таких как изображения, файлы или другие бинарные данные.
@WebServlet("/binaryResponse")
public class BinaryResponseServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=example.jpg");
try (FileInputStream fileInputStream = new FileInputStream("/path/to/example.jpg");
ServletOutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
}
}
➕ Одновременно использовать `PrintWriter` и ServletOutputStream нельзя в одном HTTP-ответе. Это приведет к исключению IllegalStateException.
➕ Выберите один метод вывода в зависимости от типа данных, которые вы хотите отправить:
Для текстовых данных используйте PrintWriter, а для бинарных данных используйте ServletOutputStream.
Правильное использование этих потоков гарантирует, что данные будут отправлены корректно и целостно.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
