Тип http.Cookie
Тип http.Cookie представляет HTTP-куки, которые используются
для хранения состояния между запросами. Структура содержит поля
для имени Name и значения Value, а также дополнительные
параметры: Path, Domain, Expires,
MaxAge, Secure, HttpOnly и другие.
Структура http.Cookie
type 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 определяют доступность куки.
Создание и установка куки
Давайте создадим куку и установим ее в ответе:
package 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:
package 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:
package 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)
}
Результат выполнения кода для запроса с двумя куками:
Name: username, Value: john_doe
Name: session_id, Value: abc123
Метод возвращает срез всех кук, переданных в запросе.
Каждая кука представлена структурой http.Cookie.
Удаление куки
Чтобы удалить куку, необходимо установить ее с истекшим сроком действия:
package 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,
который возвращает все куки из запроса