Java: Веб-технологии

Теория: Сессия

Сессия – это абстракция, созданная для удобной работы с индивидуальными пользователями. Она используется для идентификации пользователей и позволяет отличать их друг от друга. Например, аутентификация на сайтах построена поверх механизма сессии. В этом уроке мы обсудим сессии в контексте 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;
}

Рекомендуемые программы

Завершено

0 / 23