Как использовать куки с Spring Boot

Spring Boot

如何在Spring Boot中使用Cookies

1. Введение

План этой статьи

  • Чтение файлов cookie HTTP
  • Установить файлы cookie HTTP
  • прочитать все файлы cookie[]
  • Установить срок действия файлов cookie
  • HTTPS и файлы cookie
  • HttpOnly Cookie
  • удалить куки

Файлы cookie HTTP (также известные какWeb cookie,куки-файлы браузера) — это небольшой фрагмент данных, который сервер хранит в браузере пользователя. Приложение на стороне сервера устанавливает файлы cookie, когда возвращает ответ на запрос браузера, браузер сохраняет файлы cookie и автоматически возвращает их серверному приложению при отправке следующего запроса.

Файлы cookie обеспечивают способ обмена информацией между сервером и браузером для управления сеансами (вход в систему, корзина покупок, счет в игре), запоминания пользовательских предпочтений (тема, принятие политики конфиденциальности) и отслеживания поведения пользователя на сайте. Файлы cookie в определенной степени снижают нагрузку на сервер, поскольку часть данных хранится на стороне браузера, поэтому эта часть данных не может быть данными, связанными с безопасностью приложения. В этой статье мы узнаем, как читать, устанавливать и удалять файлы cookie HTTP в приложении Spring Boot.

2. Чтение файлов cookie HTTP

Spring Framework предоставляет@CookieValueАннотация для получения значения файла cookie HTTP. Эту аннотацию можно использовать непосредственно в параметрах метода контроллера.



@GetMapping("/")
public String readCookie(@CookieValue(value = "username", 
                                      defaultValue = "Atta") String username) {
    return "Hey! My username is " + username;
}

Обратите внимание, что в приведенном выше фрагменте кодаdefaultValue = "Atta". Если значение по умолчанию не установлено и файл cookie с именем пользователя не найден, Spring выдастjava.lang.IllegalStateExceptionаномальный.

3. Настройка файлов cookie HTTP

Чтобы установить файлы cookie в Spring Boot, мы можем использоватьHttpServletResponseметод классаaddCookie(). Все, что вам нужно сделать, это создать новыйCookieобъект и добавить его в ответ.


@GetMapping("/change-username")
public String setCookie(HttpServletResponse response) {
    // 创建一个 cookie对象
    Cookie cookie = new Cookie("username", "Jovan");

    //将cookie对象加入response响应
    response.addCookie(cookie);

    return "Username is changed!";
}

4. Прочитать все файлы cookie[]

Помимо использования@CookieValueаннотацию, мы также можем использоватьHttpServletRequestКласс как параметр метода контроллера для чтения всех файлов cookie. Этот класс предоставляетgetCookies()метод, который возвращает все файлы cookie, отправленные браузером, в виде массива.


@GetMapping("/all-cookies")
public String readAllCookies(HttpServletRequest request) {

    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        return Arrays.stream(cookies)
                .map(c -> c.getName() + "=" + c.getValue())
                .collect(Collectors.joining(", "));
    }

    return "No cookies";
}

Пять, установите время истечения срока действия файла cookie.

Если для файла cookie не указано время истечения срока действия, его жизненный цикл будет продолжаться до истечения срока действия сеанса. Такие файлы cookie называютсясеансовые куки. Сеансовые файлы cookie остаются активными до тех пор, пока пользователь не закроет свой браузер или не очистит свои файлы cookie. Но вы можете переопределить это поведение по умолчанию и использовать классsetMaxAge()метод для установки времени истечения срока действия файла cookie.


// 创建一个 cookie对象
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // 7天过期

//将cookie对象加入response响应
response.addCookie(cookie);

Сейчас,usernameСрок действия файлов cookie не истекает после завершения сеанса, но остается действительным в течение следующих 7 дней. Перейти кsetMaxAge()Время истечения метода указано в секундах. Дата и время истечения срока действия относятся к клиенту, установившему файл cookie, а не к серверу.

6. HTTPS и файлы cookie

Нам нужно понять концепцию: что такое безопасные файлы cookie? Защищенный файл cookie — это файл cookie, который можно отправить на сервер только через зашифрованное соединение HTTPS. Файл cookie не может быть отправлен на сервер через незашифрованное HTTP-соединение. То есть, если setSecure(true) установлен, cookie не будет передаваться в Http-соединении, а только в Https-соединении.


// 创建一个 cookie对象
Cookie cookie = new Cookie("username", "Jovan");
cookie.setSecure(true);  //Https 安全cookie

//将cookie对象加入response响应
response.addCookie(cookie);

7. HTTP-файлы cookie

Файлы cookie HttpOnly используются для предотвращения атак с использованием межсайтовых сценариев (XSS), то есть файлы cookie с установленным параметром Http Only не могут передавать данные JavaScript.Document.cookieДоступ к API может получить только серверная программа на стороне сервера.


// 创建一个 cookie对象
Cookie cookie = new Cookie("username", "Jovan");
cookie.setHttpOnly(true);  //不能被js访问的Cookie

//将cookie对象加入response响应
response.addCookie(cookie);

8. Удалить файлы cookie

Чтобы удалить файлы cookie, вам необходимоMax-AgeУстановите значение 0 и установите значение файла cookie равным нулю. Не делайтеMax-AgeЗначение команды установлено на-1отрицательное число. В противном случае браузер рассматривает его как файл cookie сеанса.


// 将Cookie的值设置为null
Cookie cookie = new Cookie("username", null);
//将`Max-Age`设置为0
cookie.setMaxAge(0);

response.addCookie(cookie);

Ждем вашего внимания