Куки (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>
Самостоятельная работа
- Проделайте все шаги из урока на своем компьютере
- Запустите приложение и откройте панель разработчика в вашем браузере
- Откройте панель Application -> Cookies и проверьте, какие куки устанавливаются во время работы приложения
- Залейте изменения на GitHub
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.