В Java сервлетах существует несколько методов управления сессиями, которые позволяют сохранять и отслеживать состояние пользователя между запросами. Вот основные методы:
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();
Создание куки:
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:
String url = response.encodeURL("https://example.com/resource");
response.sendRedirect(url);<form action="nextServlet" method="post">
<input type="hidden" name="sessionId" value="12345">
<input type="submit" value="Submit">
</form>
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
👍12❤1🤔1🤯1
Cookies — это небольшие фрагменты данных, которые сервер сохраняет на устройстве пользователя и отправляет обратно серверу при последующих запросах. Они используются для хранения информации о состоянии сеанса, персонализации и отслеживания пользователей.
Установка 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
👍27❤2
Anonymous Quiz
17%
java.util.Collection содержит статические методы, java.util.Collections — нет
76%
java.util.Collection — это интерфейс, java.util.Collections — класс
3%
java.util.Collection используется для работы с файлами, java.util.Collections — с сетями
4%
java.util.Collection работает только с потоками, java.util.Collections — с базами данных
😁21👍6❤2
Класс
HttpServletRequest `getCookies()`: Возвращает массив всех cookies, отправленных с текущим запросом.Cookie[] cookies = request.getCookies();
Класс
HttpServletResponse:`addCookie(Cookie cookie)`: Добавляет указанную cookie в ответ сервлета.Cookie cookie = new Cookie("name", "value");
response.addCookie(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
👍6❤2🔥1🤯1
Метод управления сессиями в веб-приложениях, при котором информация о сессии добавляется непосредственно в URL запросов. Этот метод используется, когда браузеры не поддерживают cookies или cookies отключены.
При каждом запросе идентификатор сессии добавляется к URL в виде параметра.
Все ссылки и формы на странице должны быть изменены так, чтобы включать идентификатор сессии.
Метод `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
Anonymous Quiz
43%
Использование классов и интерфейсов
4%
Использование только классов
52%
Использование только интерфейсов
2%
Использование статических методов
🤯34👀5👍3😁3
Методы
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
👍12❤1
Для уведомления объекта в сессии о том, что сессия недействительна или закончилась, 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
Anonymous Quiz
78%
Модификатор, запрещающий наследование класса
1%
Модификатор, разрешающий наследование класса
6%
Модификатор, разрешающий изменение переменной
16%
Модификатор, запрещающий создание экземпляров класса
😁4👍2
Используйте фильтр аутентификации, чтобы проверить сессию перед доступом к сервлетам.
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
Anonymous Quiz
30%
RuntimeException
12%
IOException
56%
StackOverflowError
2%
SQLException
😁21👍2
Чтобы обеспечить Transport Layer Security (TLS) для вашего веб-приложения, вам нужно настроить HTTPS, что включает использование SSL/TLS сертификатов. Вот шаги для настройки TLS:
Можно получить сертификат от сертификационного центра (CA) или использовать бесплатный сертификат от Let's Encrypt.
Настройка зависит от используемого веб-сервера (Apache, Nginx, Tomcat и т.д.).
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/
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;
}
}sudo systemctl restart nginx
keytool -import -alias tomcat -file your_domain_name.crt -keystore /path/to/your_keystore.jks
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>
sudo systemctl restart tomcat
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
Anonymous Quiz
92%
Контейнер для классов и интерфейсов
2%
Контейнер для методов и полей
6%
Контейнер для объектов и экземпляров
0%
Контейнер для констант и переменных
👍2😁1
pom.xml:<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
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());
}
}
}
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>
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>
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