Зарегистрируйтесь, чтобы продолжить обучение

Сессия 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;
}
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>

Самостоятельная работа

  1. Проделайте все шаги из урока на своем компьютере
  2. Добавьте в приложение аутентификацию
  3. Сделайте обработчик для отображения формы логина и для самого процесса логина. Сделайте шаблон, проверять пароль не нужно
  4. Добавьте на главную страницу ссылку на страницу логина
  5. Запустите приложение и убедитесь, что все работает
  6. Откройте в своем браузере инструменты разработчика и проверьте, какие куки устанавливаются
  7. Найдите куку JSESSIONID и попробуйте удалить ее
  8. Залейте изменения на GitHub

Дополнительные материалы

  1. Официальная документация

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»