Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
33 photos
2 videos
1.13K links
Download Telegram
🤔 Какая версия Java первой включила Stream API?
Anonymous Quiz
10%
Java 7
84%
Java 8
4%
Java 9
1%
Java 10
7🤯4👍2😁1
📌 Зачем нужны и чем отличаются методы encodeURL() и encodeRedirectURL() ?

💬 Спросят с вероятностью 6%

Методы encodeURL() и encodeRedirectURL() используются для URL Rewriting (перезаписи URL) с целью обеспечения корректной передачи идентификатора сессии (session ID) при управлении сессиями. Оба метода добавляют идентификатор сессии к URL, если браузер не поддерживает cookies или если cookies отключены, но они применяются в разных контекстах.

Назначение методов

1️⃣ `encodeURL(String url)`:

Назначение: Используется для перезаписи URL, которые будут включены в ответ сервлета в качестве ссылок на страницы.

Контекст использования: Применяется при создании гиперссылок в HTML-странице.

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

          String url = response.encodeURL("http://example.com/page");
out.println("<a href=\"" + url + "\">Next Page</a>");


Описание: Этот метод добавляет идентификатор сессии к URL только в том случае, если клиент не поддерживает cookies. В противном случае, метод возвращает URL без изменений.

2️⃣ encodeRedirectURL(String url):

Назначение: Используется для перезаписи URL, которые будут использоваться в методах редиректа (sendRedirect).

Контекст использования: Применяется при выполнении редиректа на другую страницу.

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

          String url = response.encodeRedirectURL("http://example.com/page");
response.sendRedirect(url);


Описание: Этот метод также добавляет идентификатор сессии к URL, если клиент не поддерживает cookies. Он специально предназначен для обработки URL в контексте перенаправления запросов.

Примеры

С encodeURL
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;
import java.io.PrintWriter;

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();

// Генерация URL с перезаписью идентификатора сессии для гиперссылки
String url = response.encodeURL("http://example.com/nextPage");

out.println("<html><body>");
out.println("<a href=\"" + url + "\">Next Page</a>");
out.println("</body></html>");
}
}


С encodeRedirectURL
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("/redirectExample")
public class RedirectExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Генерация URL с перезаписью идентификатора сессии для редиректа
String url = response.encodeRedirectURL("http://example.com/nextPage");

// Перенаправление на другой URL
response.sendRedirect(url);
}
}


Методы encodeURL() и encodeRedirectURL() предназначены для перезаписи URL с добавлением идентификатора сессии, если браузер не поддерживает cookies. encodeURL используется для создания гиперссылок, включаемых в ответ сервлета, а encodeRedirectURL — для URL, используемых в редиректах. Эти методы обеспечивают корректное управление сессиями и поддерживают взаимодействие с клиентами независимо от их поддержки cookies.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1👀1
📌 Что такое «сессия» ?

💬 Спросят с вероятностью 6%

Сессия (или сессия пользователя) в контексте веб-приложений — это способ сохранения состояния между различными запросами от одного и того же клиента (пользователя) к серверу. HTTP-протокол по своей природе является статeless (без состояния), что означает, что каждый запрос от клиента к серверу обрабатывается как независимый и не связанный с предыдущими запросами. Сессии позволяют обойти это ограничение и поддерживать непрерывное взаимодействие между клиентом и сервером.

Основные характеристики

1️⃣ Идентификатор сессии (Session ID):

Уникальный идентификатор, который присваивается каждому клиенту при установлении сессии. Этот идентификатор используется для связи запросов с определенной сессией.

Идентификатор сессии обычно передается клиенту через cookies или URL rewriting.

2️⃣ Сохранение состояния:

Сессия позволяет хранить данные о пользователе между запросами, такие как данные аутентификации, настройки пользователя, содержимое корзины покупок и другие временные данные.

3️⃣ Время жизни сессии:

Сессии имеют ограниченное время жизни. Оно может быть установлено явно и определяется периодом бездействия пользователя или временем с момента создания сессии.

🤔 Как сессии работают в сервлетах

Предоставляет интерфейс HttpSession для работы с сессиями. Сессии могут быть созданы и использованы следующим образом:

Создание и получение сессии

Когда клиент отправляет запрос к серверу, можно получить текущую сессию или создать новую, если она еще не существует:
HttpSession session = request.getSession(true); // true означает создание новой сессии, если она отсутствует


Установка атрибутов в сессии

Можно сохранить данные в сессии, используя методы setAttribute и getAttribute:
// Установка атрибута в сессии
session.setAttribute("username", "JohnDoe");

// Получение атрибута из сессии
String username = (String) session.getAttribute("username");


Управление временем жизни сессии

Можно установить время жизни сессии (в секундах) с помощью метода setMaxInactiveInterval:
session.setMaxInactiveInterval(30 * 60); // Установка времени жизни сессии в 30 минут


Завершение сессии

Сессию можно завершить явно, вызвав метод invalidate:
session.invalidate(); // Инвалидирует текущую сессию


Пример работы с сессией в сервлете
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/sessionExample")
public class SessionExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();

// Получение или создание новой сессии
HttpSession session = request.getSession(true);

// Установка атрибута в сессии
session.setAttribute("username", "JohnDoe");

// Получение атрибута из сессии
String username = (String) session.getAttribute("username");

out.println("<html><body>");
out.println("<h1>Session Example</h1>");
out.println("<p>Username: " + username + "</p>");
out.println("</body></html>");
}
}


Сессия — это способ сохранить состояние пользователя между различными запросами в веб-приложении. Сервлетах сессии управляются через интерфейс HttpSession, позволяя сохранять и получать данные, управлять временем жизни сессии и завершать её по необходимости. Сессии помогают обеспечивать непрерывное взаимодействие пользователя с приложением, сохраняя важную информацию между запросами.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какая коллекция в Java обеспечивает доступ по индексу?
Anonymous Quiz
5%
Set
80%
List
13%
Map
2%
Queue
👍71
📌 Как уведомить объект в сессии, что сессия недействительна или закончилась ?

💬 Спросят с вероятностью 6%

Предоставляется возможность уведомления объектов, находящихся в сессии, о том, что сессия становится недействительной или заканчивается. Для этого объекты могут реализовывать интерфейс HttpSessionBindingListener или HttpSessionListener.

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

Позволяет объектам узнавать, когда они добавляются или удаляются из сессии.

Методы интерфейса 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 bound to session: " + event.getSession().getId());
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// Код, который выполняется при удалении объекта из сессии или при завершении сессии
System.out.println("Object unbound from session: " + event.getSession().getId());
}
}


Добавление объекта в сессию
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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/addObject")
public class AddObjectServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
MySessionObject myObject = new MySessionObject();
session.setAttribute("myObject", myObject);
response.getWriter().println("Object added to session.");
}
}


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

Позволяет отслеживать события создания и уничтожения сессии на уровне приложения.

Методы интерфейса HttpSessionListener

sessionCreated(HttpSessionEvent se): Вызывается при создании сессии.
sessionDestroyed(HttpSessionEvent se): Вызывается при уничтожении сессии.

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
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());
}
}


Регистрация слушателей

Если вы не используете аннотации, вы можете зарегистрировать слушателей в файле web.xml.
<web-app ...>
<listener>
<listener-class>com.example.MySessionListener</listener-class>
</listener>
</web-app>


Чтобы уведомить объект в сессии о том, что сессия стала недействительной или закончилась, объект может реализовывать интерфейс HttpSessionBindingListener. Для отслеживания событий создания и уничтожения сессий на уровне приложения используется интерфейс HttpSessionListener. Оба интерфейса позволяют выполнять необходимые действия при изменении состояния сессий и управлять ресурсами эффективно.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

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

💬 Спросят с вероятностью 6%

Для обеспечения доступа к сервлетам только для пользователей с действительной сессией и правильными учетными данными существует несколько подходов. Один из эффективных способов — это использование фильтров (Servlet Filters) для проверки сессии перед обработкой запроса сервлетом.

Использование Servlet Filters для проверки сессии

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

1️⃣ Создание фильтра:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.FilterServletRequest;
import javax.servlet.FilterServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/*") // Применение фильтра ко всем запросам
public class SessionValidationFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Инициализация фильтра (если необходимо)
}

@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); // false означает не создавать новую сессию, если она отсутствует

// Проверка наличия сессии и атрибутов сессии (например, логин пользователя)
if (session == null || session.getAttribute("user") == null) {
// Перенаправление на страницу логина, если сессия недействительна
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
} else {
// Продолжение цепочки фильтров и передача запроса сервлету
chain.doFilter(request, response);
}
}

@Override
public void destroy() {
// Очистка ресурсов фильтра (если необходимо)
}
}


2️⃣ Регистрация фильтра в web.xml (если не используете аннотации):

<web-app ...>
<filter>
<filter-name>SessionValidationFilter</filter-name>
<filter-class>com.example.SessionValidationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionValidationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>


Использование декларативной безопасности

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

<web-app ...>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/login-error.html</form-error-page>
</form-login-config>
</login-config>

<security-role>
<role-name>USER</role-name>
</security-role>
</web-app>


Для обеспечения доступа к сервлетам только для пользователей с действительной сессией наиболее эффективным способом является использование Servlet Filters для проверки сессии. Фильтры позволяют централизованно управлять доступом к ресурсам и обеспечивать безопасность, а также можно использовать декларативную безопасность в web.xml для управления доступом на основе ролей.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
4🤯2👍1
📌 Как мы можем обеспечить transport layer security для нашего веб приложения ?

Спросят с вероятностью 6%

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

1️⃣ Получение SSL/TLS сертификата

Для использования HTTPS на вашем веб-сервере, вам потребуется SSL/TLS сертификат, который можно получить у сертификационного центра (CA). Некоторые популярные CA включают:

Let’s Encrypt (бесплатный)

DigiCert

Comodo

GlobalSign

2️⃣ Настройка веб-сервера для использования HTTPS

В зависимости от вашего веб-сервера (Apache, Nginx, Tomcat и т.д.), процесс настройки будет различаться.

Apache HTTP Server

1️⃣ Установка SSL/TLS модуля:

Убедитесь, что модуль mod_ssl установлен и включен.
      sudo a2enmod ssl
sudo systemctl restart apache2


2️⃣ Настройка виртуального хоста для HTTPS:

Отредактируйте файл конфигурации виртуального хоста (например, /etc/apache2/sites-available/your-site.conf):
      <VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html

SSLEngine on
SSLCertificateFile /path/to/your_certificate.crt
SSLCertificateKeyFile /path/to/your_private.key
SSLCertificateChainFile /path/to/chain_file.crt

<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>


3️⃣ Перезапуск Apache:

      sudo systemctl restart apache2


Nginx

1️⃣ Настройка конфигурации для HTTPS:

Отредактируйте файл конфигурации вашего сайта (например, /etc/nginx/sites-available/your-site):
      server {
listen 443 ssl;
server_name example.com;

ssl_certificate /path/to/your_certificate.crt;
ssl_certificate_key /path/to/your_private.key;

root /var/www/html;
index index.html index.htm;

location / {
try_files $uri $uri/ =404;
}
}

server {
listen 80;
server_name example.com;

return 301 https://$host$request_uri;
}


Перезапуск Nginx:
      sudo systemctl restart nginx


Apache Tomcat

1️⃣ Настройка `server.xml` для использования HTTPS:

Отредактируйте файл server.xml (например, conf/server.xml):
      <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/your_keystore.jks"
type="RSA" />
</SSLHostConfig>
</Connector>


2️⃣ Создание Keystore и получение сертификата:

Создайте keystore и получите сертификат от CA, затем импортируйте сертификат в keystore:
      keytool -genkey -alias tomcat -keyalg RSA -keystore your_keystore.jks
keytool -import -alias tomcat -file your_certificate.crt -keystore your_keystore.jks


Перезапуск Tomcat:
      sudo systemctl restart tomcat


3️⃣ Принудительное использование HTTPS

Рекомендуется перенаправлять все HTTP-запросы на HTTPS для обеспечения полной безопасности. Примеры для различных серверов:

Apache HTTP Server
Внутри виртуального хоста для порта 80 добавьте перенаправление:
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>


Для обеспечения Transport Layer Security (TLS) вашего веб-приложения:

1️⃣ Получите SSL/TLS сертификат.

2️⃣ Настройте ваш веб-сервер для использования HTTPS.

3️⃣ Принудительно перенаправляйте HTTP-запросы на HTTPS.

4️⃣ Обновите конфигурацию приложения и все ссылки для использования HTTPS.

5️⃣ Настройте cookies с атрибутом Secure для защиты данных сессий.

Эти шаги помогут вам защитить данные пользователя и предотвратить перехват и подмену данных во время передачи.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82🤯1
📌 Как организовать подключение к базе данных, обеспечить журналирование в сервлете ?

💬 Спросят с вероятностью 6%

Настройка подключения к базе данных и журналирования в сервлете

Шаг 1: Настройка пула соединений к базе данных

Использование пула соединений (например, Apache DBCP) позволяет эффективно управлять соединениями, улучшая производительность и стабильность приложения.

1️⃣ Добавление зависимостей в `pom.xml`:

      <dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>


2️⃣ Настройка пула соединений:

      import org.apache.commons.dbcp2.BasicDataSource;

public class DatabaseUtil {
private static BasicDataSource dataSource;

static {
dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
dataSource.setUsername("your_username");
dataSource.setPassword("your_password");
dataSource.setMinIdle(5);
dataSource.setMaxIdle(10);
dataSource.setMaxOpenPreparedStatements(100);
}

public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}


Шаг 2: Настройка логирования (SLF4J и Logback)

1️⃣ Добавление зависимостей в dataSource
      <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>


2️⃣ Конфигурация Logback (`logback.xml`):

      <configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>


Шаг 3: Подключение к базе данных и логирование в сервлете

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
import org.slf4j.*;

@WebServlet("/databaseServlet")
public class DatabaseServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(DatabaseServlet.class);

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
try (PrintWriter out = response.getWriter();
Connection connection = DatabaseUtil.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT * FROM your_table");
ResultSet resultSet = statement.executeQuery()) {

while (resultSet.next()) {
out.println("<p>" + resultSet.getString("your_column") + "</p>");
}
} catch (SQLException e) {
logger.error("Database connection error", e);
response.getWriter().println("<p>Error connecting to the database</p>");
}
}
}


Для организации подключения к базе данных и обеспечения журналирования в сервлете:

1️⃣ Настройте пул соединений (например, Apache DBCP).

2️⃣ Используйте библиотеку логирования (например, SLF4J с Logback).

3️⃣ Внедрите эти инструменты в сервлет для эффективного управления соединениями и ведения журналов для отслеживания событий и ошибок.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯4👍2
📌 Какие основные особенности появились в спецификации Servlet 3 ?

💬 Спросят с вероятностью 6%

Спецификация Servlet 3.0, выпущенная как часть Java EE 6, внесла множество новых особенностей и улучшений в Java Servlet API. Основные нововведения включают поддержку аннотаций, асинхронную обработку запросов, облегчение настройки сервлетов и фильтров, а также улучшенную безопасность. Рассмотрим эти особенности подробнее:

1️⃣ Поддержка аннотаций

Введены аннотации, которые позволяют конфигурировать сервлеты, фильтры и слушатели без необходимости редактирования файла web.xml. Это значительно упрощает процесс разработки и улучшает читаемость кода.

`@WebServlet`: для регистрации сервлета.

    import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
// Реализация сервлета
}


@WebFilter: для регистрации фильтра.

    import javax.servlet.annotation.WebFilter;
import javax.servlet.Filter;

@WebFilter("/*")
public class ExampleFilter implements Filter {
// Реализация фильтра
}


@WebListener: для регистрации слушателя.

    import javax.servlet.annotation.WebListener;
import javax.servlet.ServletContextListener;

@WebListener
public class ExampleListener implements ServletContextListener {
// Реализация слушателя
}


2️⃣ Асинхронная обработка запросов

Servlet 3.0 добавляет поддержку асинхронной обработки запросов, что позволяет сервлетам обрабатывать долгосрочные задачи, не блокируя основной поток. Это полезно для улучшения производительности и масштабируемости.
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/asyncExample", asyncSupported = true)
public class AsyncExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
final AsyncContext asyncContext = request.startAsync();
asyncContext.start(() -> {
try {
// Долгосрочная задача
Thread.sleep(5000);
response.getWriter().println("Asynchronous processing complete.");
asyncContext.complete();
} catch (Exception e) {
e.printStackTrace();
}
});
}
}


Динамическое добавление компонентов

Servlet 3.0 позволяет динамически добавлять сервлеты, фильтры и слушатели программно в ServletContextListener или в любое другое место, где доступен ServletContext.
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration;

public class DynamicServletRegistrationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
ServletRegistration.Dynamic registration = context.addServlet("dynamicServlet", new ExampleServlet());
registration.addMapping("/dynamic");
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
// Очистка ресурсов (если необходимо)
}
}


Servlet 3.0 ввел множество полезных особенностей, таких как поддержка аннотаций для конфигурации сервлетов, фильтров и слушателей, асинхронная обработка запросов для улучшения производительности, динамическое добавление компонентов, улучшенная безопасность и общая легкость настройки. Эти нововведения значительно упростили разработку и повысили гибкость и масштабируемость веб-приложений.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤯1
📌 Какие способы аутентификации доступны сервлету ?

💬 Спросят с вероятностью 6%

Доступны несколько способов аутентификации пользователей, чтобы обеспечить безопасность веб-приложений. Вот основные из них:

1️⃣ Базовая аутентификация (Basic Authentication)

Базовая аутентификация использует заголовок HTTP для передачи имени пользователя и пароля в закодированном виде Base64.
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>BASIC</auth-method>
<realm-name>MyRealm</realm-name>
</login-config>

<security-role>
<role-name>USER</role-name>
</security-role>


2️⃣ Аутентификация на основе форм (Form-Based Authentication)

Этот метод позволяет создать пользовательский интерфейс для аутентификации с помощью HTML-форм.
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/login-error.html</form-error-page>
</form-login-config>
</login-config>

<security-role>
<role-name>USER</role-name>
</security-role>


3️⃣ Аутентификация на основе сертификатов (Client-Certificate Authentication)

Используется сертификат клиента для аутентификации.
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>

<security-role>
<role-name>USER</role-name>
</security-role>


Важные моменты

1️⃣ Безопасность: Всегда используйте HTTPS для передачи учетных данных, чтобы защитить их от перехвата.

2️⃣ Управление сессиями: Убедитесь, что сессии пользователей защищены от угонов и утечек.

3️⃣ Шифрование данных: Храните пароли в зашифрованном виде и используйте современные алгоритмы хеширования.

Доступные методы аутентификации для сервлетов включают:

1️⃣ Базовая аутентификация (Basic Authentication)

2️⃣ Аутентификация на основе форм (Form-Based Authentication)

3️⃣ Аутентификация на основе сертификатов (Client-Certificate Authentication)

4️⃣ Программная аутентификация (Programmatic Authentication)

5️⃣ Single Sign-On (SSO)

Выбор метода зависит от требований безопасности и удобства пользователей вашего веб-приложения.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯3🔥1🤔1
📌 Что такое Java Server Pages JSP ?

💬 Спросят с вероятностью 6%

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

Особенности

1️⃣ Смесь HTML и Java:

Позволяет смешивать HTML и Java код, что упрощает создание динамических веб-страниц. Основной HTML код может быть украшен вставками Java для выполнения динамических действий.

2️⃣ Простота использования:

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

3️⃣ Доступ к серверным ресурсам:

Страницы могут легко взаимодействовать с серверными ресурсами, такими как базы данных, сервлеты, JavaBeans и т.д.

4️⃣ Перевод в сервлеты:

Страницы компилируются в сервлеты, что позволяет использовать все возможности сервлетов, такие как управление сессиями и использование фильтров.

Основные элементы

1️⃣ Скриптлеты (Scriptlets):

Вставки Java кода, которые выполняются на сервере и могут включать любые валидные Java выражения.

Синтаксис: <% ... %>

Пример:

          <% 
String message = "Hello, World!";
%>
<p><%= message %></p>


2️⃣ Выражения (Expressions):

Вставки Java кода, результаты которых автоматически выводятся на страницу.

Синтаксис: <%= ... %>

Пример:

          <p>Current time: <%= new java.util.Date() %></p>


3️⃣ Директивы (Directives):

Указания для контейнера JSP о том, как обрабатывать страницу.

Синтаксис: <%@ ... %>

Пример:

          <%@ page contentType="text/html;charset=UTF-8" %>


4️⃣ Выражения языка JSP (JSP Expression Language, EL):

Упрощенный синтаксис для доступа к данным и обращения к методам.

Синтаксис: ${ ... }

Пример:

          <p>User: ${user.name}</p>


5️⃣ Теги (Tags):

Использование стандартных JSP тегов или пользовательских тегов для выполнения часто используемых задач.

Пример:

          <jsp:include page="header.jsp" />


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>JSP Example</noscript>
</head>
<body>
<h1>Welcome to JSP!</h1>
<%
String username = "John Doe";
%>
<p>Hello, <%= username %></p>
<p>Current time: <%= new java.util.Date() %></p>
</body>
</html>


Важные моменты

1️⃣ Поддержка MVC:

Часто используется в архитектуре MVC (Model-View-Controller) для разделения логики и представления, где JSP отвечает за представление (View), а сервлеты или другие компоненты за логику (Controller).

2️⃣ Производительность:

Страницы компилируются в сервлеты, что обеспечивает высокую производительность, так как последующие запросы могут обрабатываться быстрее после начальной компиляции.

3️⃣ Управление сессиями и состоянием:

Страницы могут легко взаимодействовать с объектами сессий и использовать переменные для отслеживания состояния пользователя.

Java Server Pages (JSP) — это технология для создания динамически генерируемых веб-страниц на стороне сервера, которая позволяет смешивать HTML с Java кодом. Страницы компилируются в сервлеты, что обеспечивает высокую производительность и гибкость в разработке веб-приложений. Основные элементы включают скриптлеты, выражения, директивы, выражения языка JSP (EL) и теги. Является важным компонентом архитектуры MVC и широко используется для создания интерактивных и динамичных веб-приложений.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤔1👀1
📌 Зачем нужен JSP ?

💬 Спросят с вероятностью 6%

Java Server Pages (JSP) является мощной технологией для создания динамически генерируемых веб-страниц на стороне сервера. Предоставляет множество преимуществ и решает ряд задач, которые делают его необходимым в разработке веб-приложений:

1️⃣ Генерация динамического контента

Позволяет создавать веб-страницы, контент которых может изменяться в зависимости от запросов пользователя, данных из базы данных или других серверных ресурсов.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>Dynamic Content</noscript>
</head>
<body>
<h1>Welcome, <%= request.getParameter("username") %>!</h1>
</body>
</html>


2️⃣ Разделение логики и представления (MVC)

Используется в архитектуре для разделения бизнес-логики (которая обрабатывается сервлетами или другими компонентами) и представления (отображение данных пользователю).

Сервлет (Controller):

    @WebServlet("/greeting")
public class GreetingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
request.setAttribute("name", name);
request.getRequestDispatcher("/greeting.jsp").forward(request, response);
}
}


JSP (View):

    <html>
<head><noscript>Greeting</noscript></head>
<body>
<h1>Hello, ${name}!</h1>
</body>
</html>


3️⃣ Интеграция с JavaBeans и другими компонентами

Может легко интегрироваться с JavaBeans, EJB и другими серверными компонентами для управления данными и бизнес-логикой.
<jsp:useBean id="user" class="com.example.User" scope="request"/>
<p>Username: <jsp:getProperty name="user" property="username"/></p>


4️⃣ Поддержка выражений языка JSP (EL)

Упрощает доступ к данным и позволяет использовать упрощенный синтаксис для работы с атрибутами запросов, сессий и других областей.
<p>Current user: ${user.username}</p>


5️⃣ Повторное использование компонентов и модульность

Позволяет использовать теги и фрагменты JSP (JSP include и tag libraries) для создания модульных и повторно используемых компонентов.
<%@ include file="header.jsp" %>
<%@ include file="footer.jsp" %>


6️⃣ Простота и удобство разработки

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

7️⃣ Высокая производительность

Страницы компилируются в сервлеты, что обеспечивает высокую производительность и возможность кэширования для последующих запросов.

8️⃣ Поддержка международных стандартов и спецификаций.

Является частью спецификации Java EE, что обеспечивает соответствие стандартам и хорошую интеграцию с другими технологиями Java EE.

JSP нужен для создания динамически генерируемых веб-страниц, разделения логики и представления (MVC), интеграции с JavaBeans и другими компонентами, упрощенного доступа к данным с помощью EL, повторного использования компонентов и модульности, а также обеспечения высокой производительности и соответствия международным стандартам. Делает разработку веб-приложений удобной и эффективной, предоставляя мощные инструменты для создания интерактивного и динамичного контента.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
📌 Что такое иерархия коллекций ?

💬 Спросят с вероятностью 62%

Java Server Pages (JSP) является мощной технологией для создания динамически генерируемых веб-страниц на стороне сервера. Предоставляет множество преимуществ и решает ряд задач, которые делают его необходимым в разработке веб-приложений:

🤔 Основные интерфейсы

Collection Interface: Корневой интерфейс иерархии коллекций. Определяет методы, такие как add(), remove(), size(), isEmpty() и iterator(), которые должны быть реализованы всеми коллекциями.

List Interface: Представляет упорядоченную коллекцию. Элементы в списке могут быть доступны по индексам. Допускает дублирование элементов. Реализации включают ArrayList, LinkedList и Vector.

Set Interface: Набор уникальных элементов. Не допускает дублирования элементов. Реализации включают HashSet, LinkedHashSet и TreeSet.

Queue Interface: Для работы с коллекциями, используемыми для хранения элементов перед обработкой. Поддерживает операции вставки, извлечения и инспекции. LinkedList реализует как List, так и Queue. Также есть PriorityQueue для элементов, которые должны обрабатываться в порядке приоритета.

Map Interface: Не наследуется от Collection интерфейса. Описывает структуру для хранения пар ключ/значение. Ключи уникальны, а значения могут дублироваться. Реализации включают HashMap, LinkedHashMap, TreeMap и Hashtable.

🤔 Особенности классов

ArrayList: Динамический массив для хранения элементов, который автоматически расширяется. Предлагает быстрый доступ к элементам по индексу.

LinkedList: Двусвязный список, который обеспечивает эффективное добавление/удаление элементов. Может использоваться как список и очередь.

HashSet: Использует хеш-таблицу для хранения уникальных элементов. Не гарантирует порядок элементов.

LinkedHashSet: Расширяет HashSet, сохраняя порядок вставки элементов.

TreeSet: Хранит элементы в отсортированном и восходящем порядке. Использует красно-черное дерево.

HashMap: Хеш-таблица для хранения пар ключ/значение. Не поддерживает упорядоченность ключей или значений.

LinkedHashMap: Расширяет HashMap, сохраняя порядок вставки ключей.

TreeMap: Реализует красно-черное дерево, сохраняет ключи в отсортированном порядке.

PriorityQueue: Элементы добавляются согласно их приоритету, определенному компаратором.

🤔 Суть иерархии коллекций

Иерархия коллекций обеспечивает унифицированный способ работы с различными типами данных. Она предоставляет гибкость для выбора подходящей структуры данных в зависимости от требований к производительности, порядку элементов и уникальности значений. Использование этих коллекций позволяет разработчикам эффективно хранить, извлекать, удалять и обрабатывать данные в Java-приложениях.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
10🤯5👍3🔥1
🤔 Какой метод используется для завершения работы программы в Java?
Anonymous Quiz
76%
System.exit()
9%
Runtime.exit()
5%
Program.terminate()
10%
Application.shutdown()
1👍1
📌 Что такое SOLID ?

💬 Спросят с вероятностью 62%

SOLID — это акроним, представляющий пять основных принципов ООП и дизайна, направленных на повышение гибкости, масштабируемости и поддерживаемости ПО. Они помогает избежать проблемы с проектированием, такие как жесткая зависимость между компонентами программы и сложности в внесении изменений или добавлении новых функций.

🤔 Принцип единственной ответственности (SRP)

Подчеркивает важность разделения функциональности, чтобы каждый класс выполнял только одну задачу.
class UserSettings {
void changeEmail(User user) {
if(checkAccess(user)) {
// Изменение email пользователя
}
}

boolean checkAccess(User user) {
// Проверка прав доступа
return true;
}
}


Здесь класс UserSettings нарушает SRP, если бы в нем также были методы для управления пользователями. Лучше вынести метод checkAccess в отдельный класс.

2️⃣ Принцип открытости/закрытости (OCP): Можно добавлять новую функциональность, не изменяя существующий код.

3️⃣ Принцип подстановки Лисков (LSP): Классы-наследники должны дополнять, а не изменять поведение базовых классов.

4️⃣ Принцип разделения интерфейса (ISP): Этот принцип ведет к созданию узкоспециализированных интерфейсов, вместо одного "толстого" интерфейса.

5️⃣ Принцип инверсии зависимостей (DIP): Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей, а детали должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимостей между модулями программы.

🤔 Суть SOLID

SOLID принципы направлены на создание гибкой, масштабируемой архитектуры, которая легко поддается изменениям и развитию. Используя эти принципы, можно создавать системы, которые легче понимать, поддерживать и расширять.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍10🎉1
📌 Что известно про иерархию исключений ?

💬 Спросят с вероятностью 69%

Иерархия исключений организована в виде дерева наследования, где все классы исключений являются потомками класса Throwable. Он делится на два основных подкласса: Error и Exception.

🤔 Throwable

От него напрямую наследуются классы Error и Exception. Этот класс содержит методы для получения сообщения об ошибке, локализованного сообщения, причины исключения и стека вызовов, а также методы для подавления исключений и работы со стеком вызовов.

🤔 Error

Error описывает серьёзные ошибки, возникающие на уровне виртуальной машины и библиотеки языка, из-за которых приложение обычно не может восстановиться. Примеры включают OutOfMemoryError и StackOverflowError. Ошибки этого типа обычно не предназначены для обработки приложением.

Непроверяемые исключения

Являются непроверяемыми исключениями. Они обозначают ошибки, такие как неверное приведение типов (ClassCastException), обращение по нулевой ссылке (NullPointerException) и выход за пределы массива (ArrayIndexOutOfBoundsException). Эти исключения не требуют обязательной обработки в блоке try-catch.

Проверяемые исключения

Требуют обязательной обработки в блоке try-catch или должны быть объявлены в сигнатуре метода с помощью throws. Они бозначают условия, с которыми приложение может предвидеть и справиться. Примеры включают IOException, FileNotFoundException и ClassNotFoundException.

🤔 Суть иерархии исключений

Иерархия исключений обеспечивает структурированный и гибкий способ обработки ошибок и исключительных ситуаций в приложениях. Позволяет различать серьёзные проблемы системного уровня, с которыми приложение не может справиться.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥8