Сессия – это абстракция, созданная для удобной работы с индивидуальными пользователями. Она используется для идентификации пользователей и позволяет отличать их друг от друга. Например, аутентификация на сайтах построена поверх механизма сессии. В этом уроке мы обсудим сессии в контексте Java.
Как работают сессии
Сессия использует куки для своей работы. Для каждого пользователя создается своя кука со специальным идентификатором, который сложно подобрать. Это происходит во время первого обращения к сессии. Больше кука никак не используется, все данные записываются в память рабочего приложения:
Cookie: JSESSIONID=node01lywaspcyuggy15sok9tw6q9eh0.node0
Принцип работы с данными сессии очень похож на то, как идет работа с куками. Мы можем добавить данные в сессию и прочитать их:
ctx.sessionAttribute("my-key", "My value");
ctx.sessionAttribute("my-key"); // My value
Добавленные данные хранятся в сессии до тех пор, пока не произойдет одно из следующих событий:
- Кука будет удалена
- Закончится время жизни куки
- Данные сессии будут удалены на бэкенде
Данные внутри сессии хранятся в текстовом виде, поэтому их придется преобразовывать в строки:
ctx.sessionAttribute("my-key", String.valueOf(10));
Integer.valueOf(ctx.sessionAttribute("my-key")); // 10
Как использовать сессии
Реализуем упрощенный пример аутентификации на сайте. Для этого создадим SessionsController
с тремя маршрутами:
// Отображение формы логина
app.get("/sessions/build", SessionsController::build);
// Процесс логина
app.post("/sessions", SessionsController::create);
// Процесс выхода из аккаунта
app.delete("/sessions", SessionsController::destroy);
Контроллер:
package org.example.hexlet.controller;
import io.javalin.http.Context;
public class SessionsController {
public static void build(Context ctx) {
ctx.render("sessions/build.jte");
}
public static void create(Context ctx) {
var nickname = ctx.formParam("nickname");
// Тут должна быть проверка пароля
ctx.sessionAttribute("currentUser", nickname);
ctx.redirect("/");
}
public static void destroy(Context ctx) {
ctx.sessionAttribute("currentUser", null);
ctx.redirect("/");
}
}
Шаблон:
@import org.example.hexlet.NamedRoutes
<!-- sessions/build.jte -->
<!-- Нужно не забыть добавить маршрут в NamedRoutes -->
<form action="${NamedRoutes.sessionsPath()}" method="post">
<input type="text" placeholder="Nickname" name="nickname" />
<input type="password" placeholder="Password" name="password" />
<input type="submit" />
</form>
Во время логина мы записываем идентификатор пользователя в сессию. Когда нужно, мы читаем этот идентификатор, извлекаем необходимые данные о пользователе и используем их. Когда мы познакомимся с базами данных, то реализуем полноценный пример.
Ниже вы видите код вывода блока на главной странице для залогиненных пользователей:
// src/org/example/hexlet/dto/MainPage.java
package org.example.hexlet.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public class MainPage {
private String currentUser;
}
package org.example.hexlet;
import org.example.hexlet.dto.MainPage;
import io.javalin.Javalin;
public class HelloWorld {
public static void main(String[] args) {
var app = Javalin.create(config -> {
config.bundledPlugins.enableDevLogging();
});
app.get("/", ctx -> {
var page = new MainPage(ctx.sessionAttribute("currentUser"));
ctx.render("index.jte", model("page", page));
});
app.start(7070);
}
}
@import org.example.hexlet.dto.MainPage
@param MainPage page
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Hello Hexlet!</title>
</head>
<body>
<main>
<h1>Привет, Хекслет!</h1>
@if(page.getCurrentUser() != null)
Добро пожаловать, ${page.getCurrentUser()}.
Чтобы разлогиниться, удалите куку JSESSIONID из браузера
@endif
</main>
</body>
</html>
Самостоятельная работа
- Проделайте все шаги из урока на своем компьютере
- Добавьте в приложение аутентификацию
- Сделайте обработчик для отображения формы логина и для самого процесса логина. Сделайте шаблон, проверять пароль не нужно
- Добавьте на главную страницу ссылку на страницу логина
- Запустите приложение и убедитесь, что все работает
- Откройте в своем браузере инструменты разработчика и проверьте, какие куки устанавливаются
- Найдите куку
JSESSIONID
и попробуйте удалить ее - Залейте изменения на GitHub
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.