Тип http.Cookie

Тип http.Cookie представляет HTTP-куки, которые используются для хранения состояния между запросами. Структура содержит поля для имени Name и значения Value, а также дополнительные параметры: Path, Domain, Expires, MaxAge, Secure, HttpOnly и другие.

Структура http.Cookie

gotype Cookie struct {
  Name   string
  Value  string
  Path   string
  Domain   string
  Expires  time.Time
  MaxAge   int
  Secure   bool
  HttpOnly bool
  SameSite SameSite
}

Поле Name задает имя куки, Value - ее значение. Поле Expires устанавливает дату истечения срока действия, а MaxAge - время жизни в секундах. Флаги Secure и HttpOnly определяют доступность куки.

Создание и установка куки

Давайте создадим куку и установим ее в ответе:

gopackage main

import (
  "fmt"
  "net/http"
  "time"
)

func main() {
  cookie := &http.Cookie{
    Name:   "username",
    Value:  "john_doe",
    Path:   "/",
    Expires:  time.Now().Add(24 * time.Hour),
    HttpOnly: true,
  }

  http.HandleFunc("/set", func(w http.ResponseWriter, r *http.Request) {
    http.SetCookie(w, cookie)
    fmt.Fprintln(w, "Cookie set successfully")
  })

  http.ListenAndServe(":8080", nil)
}

Функция http.SetCookie добавляет заголовок Set-Cookie в ответ. Кука будет доступна по пути "/" и истечет через 24 часа.

Чтение куки из запроса

Чтобы получить куку из запроса, используется метод Request.Cookie:

gopackage main

import (
  "fmt"
  "net/http"
)

func main() {
  http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) {
    cookie, err := r.Cookie("username")
    if err != nil {
      http.Error(w, "Cookie not found", http.StatusBadRequest)
      return
    }

    fmt.Fprintf(w, "Cookie value: %s", cookie.Value)
  })

  http.ListenAndServe(":8080", nil)
}

Метод возвращает указатель на http.Cookie и ошибку, если кука не найдена. Полученное значение можно использовать в обработчике.

Работа с несколькими куками

Для получения всех кук используется метод Request.Cookies:

gopackage main

import (
  "fmt"
  "net/http"
)

func main() {
  http.HandleFunc("/list", func(w http.ResponseWriter, r *http.Request) {
    cookies := r.Cookies()

    for _, c := range cookies {
      fmt.Fprintf(w, "Name: %s, Value: %s\n", c.Name, c.Value)
    }
  })

  http.ListenAndServe(":8080", nil)
}

Результат выполнения кода для запроса с двумя куками:

goName: username, Value: john_doe
Name: session_id, Value: abc123

Метод возвращает срез всех кук, переданных в запросе. Каждая кука представлена структурой http.Cookie.

Удаление куки

Чтобы удалить куку, необходимо установить ее с истекшим сроком действия:

gopackage main

import (
  "net/http"
  "time"
)

func main() {
  http.HandleFunc("/delete", func(w http.ResponseWriter, r *http.Request) {
    cookie := &http.Cookie{
      Name:  "username",
      Value:   "",
      Path:  "/",
      Expires: time.Unix(0, 0),
      MaxAge:  -1,
    }

    http.SetCookie(w, cookie)
    w.Write([]byte("Cookie deleted"))
  })

  http.ListenAndServe(":8080", nil)
}

Для удаления куки используются поля Expires с нулевым временем и MaxAge со значением -1.

Смотрите также

  • тип http.Request,
    содержащий методы работы с куками
  • функцию http.SetCookie,
    которая добавляет куку в HTTP-ответ
  • метод http.Request.Cookie,
    который возвращает конкретную куку из запроса
  • метод http.Request.Cookies,
    который возвращает все куки из запроса