Java | Вопросы собесов
11.4K subscribers
35 photos
2 videos
1.12K links
Download Telegram
🤔 Что такое «сессия»?

Это способ хранения данных о пользователе между запросами в веб-приложении. Она позволяет серверу "помнить" пользователя, используя уникальный идентификатор сессии. Данные сессии сохраняются на сервере, а клиенту передается идентификатор сессии, обычно через cookie или URL.

🚩Основные моменты:

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

Сессии позволяют отслеживать и сохранять состояние пользователя между запросами.
HttpSession session = request.getSession();
session.setAttribute("username", "JohnDoe");
String username = (String) session.getAttribute("username");


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍121
🤔 Как уведомить объект в сессии, что сессия недействительна или закончилась?

Для уведомления объекта в сессии о том, что сессия недействительна или закончилась, Java Servlet API предоставляет интерфейс HttpSessionBindingListener и HttpSessionListener.

🚩Использование HttpSessionBindingListener:

Этот интерфейс позволяет объекту получать уведомления, когда он добавляется или удаляется из сессии.

🟠Методы:
valueBound(HttpSessionBindingEvent event): Вызывается, когда объект добавляется в сессию.
valueUnbound(HttpSessionBindingEvent event): Вызывается, когда объект удаляется из сессии, либо когда сессия становится недействительной.
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class MySessionObject implements HttpSessionBindingListener {
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("Object added to session");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("Object removed from session or session invalidated");
    }
}

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        MySessionObject obj = new MySessionObject();
        session.setAttribute("myObject", obj);
    }
}


🚩Использование HttpSessionListener:

Этот интерфейс позволяет сервлету получать уведомления о событиях создания и уничтожения сессии.

🟠Методы:
sessionCreated(HttpSessionEvent se): Вызывается, когда создается новая сессия.
sessionDestroyed(HttpSessionEvent se): Вызывается, когда сессия становится недействительной.
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Session created: " + se.getSession().getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("Session destroyed: " + se.getSession().getId());
        HttpSession session = se.getSession();
        MySessionObject obj = (MySessionObject) session.getAttribute("myObject");
        if (obj != null) {
            obj.cleanup();
        }
    }
}


Регистрация HttpSessionListener в web.xml:
<listener>
    <listener-class>com.example.MySessionListener</listener-class>
</listener>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 Какой существует эффективный способ удостоверится, что все сервлеты доступны только для пользователя с верной сессией?

Используйте фильтр аутентификации, чтобы проверить сессию перед доступом к сервлетам.
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter("/*")
public class AuthenticationFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession session = httpRequest.getSession(false);

if (session == null || session.getAttribute("user") == null) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login.jsp");
} else {
chain.doFilter(request, response);
}
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
🤔 Какой тип исключения является потомком класса Error?
Anonymous Quiz
30%
RuntimeException
12%
IOException
56%
StackOverflowError
2%
SQLException
😁21👍2
🤔 Как мы можем обеспечить transport layer security для нашего веб приложения?

Чтобы обеспечить Transport Layer Security (TLS) для вашего веб-приложения, вам нужно настроить HTTPS, что включает использование SSL/TLS сертификатов. Вот шаги для настройки TLS:

🚩Шаги для настройки TLS:

🟠Получите SSL/TLS сертификат:
Можно получить сертификат от сертификационного центра (CA) или использовать бесплатный сертификат от Let's Encrypt.
🟠Настройте ваш сервер для использования HTTPS:
Настройка зависит от используемого веб-сервера (Apache, Nginx, Tomcat и т.д.).

🚩Пример настройки для Nginx:

1⃣Установка и настройка SSL: Скопируйте ваш сертификат и ключ в директорию:
sudo mkdir /etc/nginx/ssl
sudo cp /path/to/your_domain_name.crt /etc/nginx/ssl/
sudo cp /path/to/your_private.key /etc/nginx/ssl/


2⃣Настройте виртуальный хост для HTTPS: Добавьте в файл конфигурации Nginx (например, в /etc/nginx/sites-available/default):
server {
listen 80;
server_name your_domain_name;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl;
server_name your_domain_name;

ssl_certificate /etc/nginx/ssl/your_domain_name.crt;
ssl_certificate_key /etc/nginx/ssl/your_private.key;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

location / {
root /var/www/html;
index index.html index.htm;
}
}


3⃣Перезапустите Nginx:
sudo systemctl restart nginx


🚩Пример настройки для Tomcat:

1⃣Установка и настройка SSL: Создайте и установите SSL сертификат в Tomcat: Импортируйте сертификат в Java Keystore (если у вас его нет, создайте его):
keytool -import -alias tomcat -file your_domain_name.crt -keystore /path/to/your_keystore.jks


2⃣Настройте файл server.xml: Добавьте следующий блок в файл server.xml (например, в /usr/local/tomcat/conf/server.xml):
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="/path/to/your_keystore.jks"
type="RSA" />
</SSLHostConfig>
</Connector>


3⃣Перезапустите Tomcat:
sudo systemctl restart tomcat


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101
🤔 Как организовать подключение к базе данных, обеспечить журналирование в сервлете?

1⃣Добавьте зависимости в pom.xml:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>


2⃣Подключение к базе данных в сервлете:
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DatabaseServlet extends HttpServlet {
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String USER = "root";
private static final String PASS = "password";

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM Users")) {
while (rs.next()) {
response.getWriter().println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
}
} catch (Exception e) {
e.printStackTrace(response.getWriter());
}
}
}


🚩Журналирование (логирование):

1⃣Добавьте зависимости в pom.xml:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>


2⃣Файл конфигурации log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %c{1} - %msg%n"/>
</Console>
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>


3⃣Использование логгера в сервлете:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LoggingServlet extends HttpServlet {
private static final Logger logger = LogManager.getLogger(LoggingServlet.class);

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.info("Processing GET request");
response.getWriter().println("Check the logs for output");
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Какой интерфейс используется для выполнения операций ввода-вывода с символами?
Anonymous Quiz
19%
InputStream
8%
OutputStream
49%
Reader
24%
ByteStream
👍5🤯5
🤔 Какие основные особенности появились в спецификации Servlet 3?

🟠Аннотации для конфигурации:
Упрощенная настройка сервлетов, фильтров и слушателей без web.xml. Примеры: @WebServlet, @WebFilter, @WebListener.

🟠Асинхронная обработка:
Позволяет сервлетам обрабатывать запросы асинхронно. Пример: request.startAsync().

🟠Динамическое добавление компонентов:
Программное добавление сервлетов, фильтров и слушателей. Пример: ServletContext.addServlet().

🟠Поддержка загрузки файлов:
Встроенная поддержка для загрузки файлов через сервлеты. Пример: @MultipartConfig.

🟠Улучшения безопасности:
Объявление ролей и разрешений в аннотациях. Пример: @DeclareRoles, @RolesAllowed.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👀1
🤔 Какой из следующих интерфейсов предоставляет методы для работы с последовательностями символов?
Anonymous Quiz
2%
Appendable
8%
Readable
68%
CharSequence
22%
StringBuilder
😁8👍1
🤔 Какие способы аутентификации доступны сервлету?

🟠Basic Authentication:
Отправка имени пользователя и пароля в Base64. Конфигурация в web.xml:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Protected Area</realm-name>
</login-config>


🟠Digest Authentication:
Хеширование учетных данных для безопасности. Конфигурация в web.xml:
<login-config>
<auth-method>DIGEST</auth-method>
<realm-name>Protected Area</realm-name>
</login-config>


🟠Form-based Authentication:
Использование HTML-форм для ввода учетных данных. Конфигурация в web.xml:
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>


🟠Client Certificate Authentication:
Использование клиентских SSL-сертификатов. Конфигурация в web.xml:
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>


🟠Custom Authentication:
Реализация собственной логики через сервлеты и фильтры. Пример фильтра:
public class AuthenticationFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpSession session = httpRequest.getSession(false);
if (session != null && session.getAttribute("user") != null) {
chain.doFilter(request, response);
} else {
httpRequest.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤯21
🤔 Что такое ООП?

ООП (Объектно-Ориентированное Программирование) — это парадигма программирования, основанная на концепции объектов, которые содержат данные и методы для их обработки. Основными принципами ООП являются инкапсуляция, наследование, полиморфизм и абстракция. ООП помогает создавать гибкие, расширяемые и модульные программы. В Java все элементы программирования реализованы через объекты и классы, что делает её строго объектно-ориентированным языком.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍9👀2🤔1
🤔 Что такое Java Server Pages JSP?

Java Server Pages (JSP) — это технология для создания динамических веб-страниц с использованием Java. JSP позволяет смешивать HTML с Java-кодом для генерации динамического контента на сервере.

🚩Плюсы:

Интеграция с Java:
Вставка Java-кода в HTML-страницы.

Теги JSP:
Скриплеты: <% ... %>
Выражения: <%= ... %>
Директивы: <%@ ... %>
Декларации: <%! ... %>

JavaBeans:
Поддержка использования JavaBeans для разделения логики и представления.

Пользовательские теги:
Расширение функциональности через собственные теги.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🎉1👾1
🤔 В чем разница между checked и unchecked исключениями?

Checked исключения — это исключения, которые проверяются во время компиляции, и разработчик обязан обработать их с помощью try-catch или указать в сигнатуре метода с помощью throws. Unchecked исключения не проверяются на этапе компиляции и возникают в результате ошибок времени выполнения (например, NullPointerException). Checked исключения происходят из класса Exception, а unchecked — из класса RuntimeException. Checked исключения обычно используются для предсказуемых ошибок, которые можно обработать.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай
📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥2
🤔 Зачем нужен JSP?

JSP (JavaServer Pages) используется для создания динамических веб-страниц с помощью Java. Он позволяет внедрять Java-код прямо в HTML, упрощая генерацию контента на стороне сервера, например, для обработки форм, взаимодействия с базами данных и динамического отображения информации. JSP удобно использовать в проектах на Java для интеграции логики приложения с пользовательским интерфейсом.

🚩Основные причины использования:

🟠Создание динамического контента:
JSP позволяет генерировать HTML-код динамически на основе данных и логики, определенной на сервере. Это означает, что содержание веб-страницы может изменяться в зависимости от запросов пользователя, данных из базы данных или других факторов.

🟠Легкость интеграции с Java:
JSP тесно интегрирован с Java, что позволяет использовать все возможности Java в веб-приложениях. Разработчики могут использовать существующие Java-классы и библиотеки, что ускоряет разработку и уменьшает количество кода.

🟠Отделение логики от представления:
С помощью JSP можно отделить бизнес-логику от презентационного слоя. Логика может быть реализована в сервлетах или JavaBeans, а JSP используется для отображения данных. Это упрощает поддержку и развитие приложения.

🟠Поддержка MVC архитектуры:
JSP хорошо интегрируется с Model-View-Controller (MVC) архитектурой. JSP используется для представления (View), сервлеты или контроллеры обрабатывают запросы (Controller), а бизнес-логика и данные находятся в моделях (Model).

🟠Легкость использования и обучения:
Разработчики, знакомые с HTML, могут легко начать использовать JSP, добавляя динамическое содержимое с помощью Java. Это снижает порог входа для создания динамических веб-страниц.

🟠Поддержка тегов и библиотек тегов:
JSP поддерживает стандартные теги JSP (например, скриплеты, выражения) и позволяет создавать собственные теги. Это помогает повторно использовать код и упрощает создание сложных страниц.

🚩Примеры использования JSP:

Простой JSP файл
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>Example JSP</title>
</head>
<body>
<h1>Welcome to JSP</h1>
<p>The current date and time is: <%= new java.util.Date() %></p>
</body>
</html>


Использование JavaBeans в JSP
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="com.example.User" %>
<html>
<head>
<title>Example JSP with JavaBean</title>
</head>
<body>
<jsp:useBean id="user" class="com.example.User" scope="session"/>
<jsp:setProperty name="user" property="name" value="John Doe"/>
<h1>Welcome, <jsp:getProperty name="user" property="name"/>!</h1>
</body>
</html>


🚩Плюсы:

Производительность:
JSP страницы компилируются в сервлеты и могут быть кэшированы сервером, что улучшает производительность по сравнению с традиционными CGI-скриптами.
Расширяемость:
JSP позволяет использовать кастомные теги и таглайбы, что делает код более чистым и повторно используемым.
Поддержка большого количества библиотек и фреймворков:
JSP интегрируется с различными библиотеками и фреймворками, такими как JSTL (JSP Standard Tag Library), что делает разработку более мощной и удобной.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какие методы в классе Object знаешь?

Класс Object является родительским для всех классов в Java и включает несколько ключевых методов: `toString()`, который возвращает строковое представление объекта, `equals()` для сравнения объектов, и `hashCode()` для получения хеш-кода объекта. Также есть методы `clone()`, который создает копию объекта, и `finalize()`, вызываемый перед сборкой мусора. Другие методы включают `getClass()` для получения информации о классе и `wait()`, `notify()`, и `notifyAll()` для управления потоками.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥21
🤔 Опиши, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю?

1⃣Запрос к серверу:
Пользователь отправляет HTTP-запрос к серверу, запрашивая JSP страницу.

2⃣Перенаправление к контейнеру сервлетов:
Веб-сервер перенаправляет запрос к контейнеру сервлетов (например, Tomcat).

3⃣Проверка и компиляция:
Контейнер проверяет, была ли JSP страница изменена. Если изменена или запрашивается впервые, JSP компилируется в сервлет (Java-код).

4⃣Инициализация сервлета:
Скомпилированный сервлет загружается и инициализируется.

5⃣Обработка запроса:
Метод service() сервлета обрабатывает HTTP-запрос. Java-код в JSP выполняется, генерируя HTML.

6⃣Отправка ответа пользователю:
Сгенерированный HTML отправляется обратно клиенту (браузеру).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6