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

Теория: Cookies

Куки (cookies) — это механизм протокола HTTP, который браузер использует для хранения данных браузером. Они позволяют отслеживать или идентифицировать возвращающихся посетителей. Например, с их помощью интернет-магазины запоминают, что добавлено в корзину. В этом уроке мы изучим эту тему подробнее и выясним, как происходит работа с куками в Java.

Методы работы с куками в Javalin

Вся работа с куками в Javalin состоит из нескольких методов. Рассмотрим два основных:

  • Метод ctx.cookie("name") читает данные куки по имени. Данные доступны, если кука была отправлена из браузера вместе с запросом
  • Метод ctx.cookie("name", "value") устанавливает куку с нужным именем и значением. Если кука существовала, она будет перезаписана — это стандартное поведение HTTP

Для примера представим, что мы показываем пользователю какое-то сообщение до тех пор, пока он его не закроет. Такой подход часто используется во время знакомства с интерфейсом проекта, когда сначала показывается справка, но ее можно убрать.

Закрытие в таких случаях реализуется через JavaScript-код. Чтобы не усложнять, мы сделаем скрытие блока автоматически после обновления страницы. Другими словами, блок будет показывать только при первом заходе на сайт. Рассмотрим код дата-класса:

package org.example.hexlet.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public class MainPage {
    private Boolean visited;

    public Boolean isVisited() {
        return visited;
    }
}

Также изучим код обработчика:

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 visited = Boolean.valueOf(ctx.cookie("visited"));
            var page = new MainPage(visited);
            ctx.render("index.jte", model("page", page));
            ctx.cookie("visited", String.valueOf(true));
        });

        app.start(7070);
    }
}

Куки работают только с текстовыми данными, поэтому их нужно привести к строке во время отправки и выполнить обратное преобразовании при чтении. Для примитивных данных достаточно использовать метод valueOf. С составными данными проще всего выполнять преобразование в JSON и обратно.

В примере выше мы сначала читаем и только затем устанавливаем. При первом заходе на сайт чтение неустановленной куки вернет null. Это показывает, что пользователь зашел на сайт первый раз. Во второй раз результатом будет true, потому что установка куки произошла на первую загрузку. Осталось использовать эту информацию в шаблоне:

@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.isVisited())
        Это сообщение показывается только один раз. Если вы хотите увидеть его снова, сотрите куки
      @endif
    </main>
  </body>
</html>

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

Завершено

0 / 23