Java | Вопросы собесов
11.4K subscribers
35 photos
2 videos
1.12K links
Download Telegram
🤔 Какие различные методы управления сессией в сервлетах знаешь?

В Java сервлетах существует несколько методов управления сессиями, которые позволяют сохранять и отслеживать состояние пользователя между запросами. Вот основные методы:

🟠HTTP сессии (HttpSession): Использует объект HttpSession для хранения информации о сессии на стороне сервера.

Создание и получение сессии:
HttpSession session = request.getSession();


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


Получение существующей сессии, если она есть, иначе возвращает null:
HttpSession session = request.getSession(false);


Сохранение данных в сессии:
session.setAttribute("user", "John Doe");


Получение данных из сессии:
String user = (String) session.getAttribute("user");


Удаление данных из сессии:
session.removeAttribute("user");


Завершение сессии:
session.invalidate();


🟠Cookies (Куки): Использует HTTP cookies для сохранения информации на стороне клиента.

Создание куки:
Cookie userCookie = new Cookie("user", "John Doe");
response.addCookie(userCookie);


Получение куки из запроса:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("user".equals(cookie.getName())) {
String user = cookie.getValue();
// Использование куки
}
}
}


🟠URL Rewriting (Переписывание URL): Добавление идентификатора сессии в URL для отслеживания сессии без использования cookies.

Добавление идентификатора сессии в URL:
String url = response.encodeURL("https://example.com/resource");
response.sendRedirect(url);


🟠Hidden Form Fields (Скрытые поля формы): Использование скрытых полей формы для передачи информации о сессии между запросами.
<form action="nextServlet" method="post">
<input type="hidden" name="sessionId" value="12345">
<input type="submit" value="Submit">
</form>


🟠URL Parameters (Параметры URL): Передача информации о сессии через параметры URL.
html
<a href="nextServlet?sessionId=12345">Next Page</a>

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();
session.setAttribute("user", "John Doe");

String user = (String) session.getAttribute("user");
response.getWriter().println("User: " + user);
}
}


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

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

🚩Пример создания и получения cookies в Java:

Установка cookie:
Cookie cookie = new Cookie("username", "JohnDoe");
cookie.setMaxAge(60 * 60 * 24); // 1 день
response.addCookie(cookie);


Получение cookie:
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
String username = cookie.getValue();
// Использование cookie
}
}


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

🚩Методы для работы с cookies в сервлетах:

Класс HttpServletRequest `getCookies()`: Возвращает массив всех cookies, отправленных с текущим запросом.
Cookie[] cookies = request.getCookies();


Класс HttpServletResponse:`addCookie(Cookie cookie)`: Добавляет указанную cookie в ответ сервлета.
Cookie cookie = new Cookie("name", "value");
response.addCookie(cookie);


🚩Основные методы класса `Cookie`:

Конструктор:
Cookie cookie = new Cookie("name", "value");


setMaxAge(int expiry)
cookie.setMaxAge(60 * 60 * 24); // 1 день


setPath(String uri)
cookie.setPath("/app");


setDomain(String domain)
cookie.setDomain(".example.com");


setSecure(boolean flag)
cookie.setSecure(true);


setHttpOnly(boolean isHttpOnly)
cookie.setHttpOnly(true);


🚩Примеры:

Установка cookie:
Cookie cookie = new Cookie("username", "JohnDoe");
cookie.setMaxAge(60 * 60 * 24); // 1 день
response.addCookie(cookie);


Получение cookie:
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
String username = cookie.getValue();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥1🤯1
🤔 Что такое URL Rewriting?

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

🚩Как это работает:

🟠Добавление идентификатора сессии к URL:
При каждом запросе идентификатор сессии добавляется к URL в виде параметра.
🟠Обновление всех ссылок и форм:
Все ссылки и формы на странице должны быть изменены так, чтобы включать идентификатор сессии.

🚩Использования URL Rewriting в сервлетах:

Метод `encodeURL()`: Используется для добавления идентификатора сессии к URL.
String url = response.encodeURL("https://example.com/resource");

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 URLRewritingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("user", "John Doe");

String url = response.encodeURL("nextPage.jsp");
response.setContentType("text/html");
response.getWriter().println("<a href=\"" + url + "\">Next Page</a>");
}
}


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

🟠Сохранение идентификатора сессии:
Идентификатор сессии передается как параметр URL, например: https://example.com/resource;jsessionid=1234567890.
🟠Безопасность:
URL Rewriting менее безопасен по сравнению с cookies, так как идентификатор сессии виден в URL и может быть легко скопирован.

Плюсы
Работает без cookies: Подходит для браузеров, где cookies отключены или не поддерживаются.

Минусы:
Безопасность: Идентификатор сессии виден в URL, что делает его более уязвимым к кражам.
Удобство использования: Требуется обновление всех ссылок и форм на странице для включения идентификатора сессии.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯2
🤔 Зачем нужны и чем отличаются методы encodeURL() и encodeRedirectURL()?

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

🚩Основные цели и отличия:

🟠Назначение:
`encodeURL()`: Используется для добавления идентификатора сессии к URL для обычных ссылок, обеспечивая корректную передачу информации о сессии.
`encodeRedirectURL()`: Используется для добавления идентификатора сессии к URL при перенаправлении, обеспечивая корректную передачу информации о сессии при редиректе.

🟠Контекст использования:
`encodeURL()`: Применяется к URL, который будет отображен на странице в качестве ссылки.
`encodeRedirectURL()`: Применяется к URL, который используется в методе sendRedirect() для перенаправления.

encodeURL():
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 EncodeURLServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("user", "John Doe");

String url = response.encodeURL("nextPage.jsp");
response.setContentType("text/html");
response.getWriter().println("<a href=\"" + url + "\">Next Page</a>");
}
}


encodeRedirectURL():
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 EncodeRedirectURLServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("user", "John Doe");

String url = response.encodeRedirectURL("nextPage.jsp");
response.sendRedirect(url);
}
}


🚩Принцип работы:

`encodeURL()` и `encodeRedirectURL()` автоматически проверяют, поддерживает ли клиент cookies. Если cookies поддерживаются, методы возвращают исходный URL без изменений. Если cookies не поддерживаются, к URL добавляется идентификатор сессии в качестве параметра.

🚩Пример результата:

Без cookies: https://example.com/nextPage.jsp;jsessionid=1234567890
С cookies: https://example.com/nextPage.jsp

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🤯1
🤔 Что такое «сессия»?

Это способ хранения данных о пользователе между запросами в веб-приложении. Она позволяет серверу "помнить" пользователя, используя уникальный идентификатор сессии. Данные сессии сохраняются на сервере, а клиенту передается идентификатор сессии, обычно через 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