58、Go语言基础 - 操作 Cookie 和 Session

作者: 温新

分类: 【Go基础】

阅读: 596

时间: 2023-12-05 00:52:06

hi,我是温新

Cookie

什么是 Cookie

Cookie 是一种用于在 Web 浏览器和 Web 服务器之间传递数据的小文件。它通常由 Web 服务器创建,并在 Web 浏览器中存储,以便在后续请求中将数据发送回服务器。Cookie 的主要目的是维护Web应用程序的状态和用户身份认证。

Go 操作 Cookie

标准库net/http中定义了Cookie,它代表一个出现在HTTP响应头中Set-Cookie的值里或者HTTP请求头中Cookie的值的HTTP cookie

type Cookie struct {
    Name       string
    Value      string
    Path       string
    Domain     string
    Expires    time.Time
    RawExpires string
    // MaxAge=0表示未设置Max-Age属性
    // MaxAge<0表示立刻删除该cookie,等价于"Max-Age: 0"
    // MaxAge>0表示存在Max-Age属性,单位是秒
    MaxAge   int
    Secure   bool
    HttpOnly bool
    Raw      string
    Unparsed []string // 未解析的“属性-值”对的原始文本
}

设置 cookie

http.SetCookie 用于将Cookie添加到HTTP响应的Header中,从而在客户端(浏览器)中设置Cookie。

func SetCookie(w ResponseWriter, cookie *Cookie)

参数含义:

  • w 是实现了 http.ResponseWriter 接口的对象,通常是HTTP处理器的响应对象,用于发送HTTP响应。
  • cookie 是一个指向 http.Cookie 结构的指针,它包含了要设置的Cookie的属性和值。

获取 cookie

获取 cookie 有 2 种方法,如下:

func (r *Request) Cookie(name string) (*Cookie, error)

参数:

  • name 是要获取的Cookie的名称。

返回值:

  • *Cookie,表示HTTP请求中指定名称的Cookie。
  • error,如果未找到指定名称的Cookie,则返回一个http.ErrNoCookie错误。
func (r *Request) Cookies() []*Cookie

参数:

  • 无参数,因为它是Request对象的方法。

返回值:

  • []*Cookie,表示HTTP请求中的所有Cookie。返回一个包含所有Cookie的切片。
package main

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

func main() {
	// 设置 cookie
	http.HandleFunc("/go/setcookie", setCookieHandler)
	// 获取 cookie
	http.HandleFunc("/go/getcookie", getCookieHandler)
	// 删除 cookie
	http.HandleFunc("/go/delete_cookie", deleteCookieHandler)
	http.ListenAndServe(":9999", nil)
}

// 设置 cookie
func setCookieHandler(w http.ResponseWriter, r *http.Request) {
	// 创建一个 cookie
	cookie := http.Cookie{
		Name:     "username",
		Value:    "wangmeili",
		Path:     "/",
		HttpOnly: true,
	}
	// 将 Cookie 添加到 HTTP 响应的 Header 中
	http.SetCookie(w, &cookie)
	// 响应消息
	w.Write([]byte("cookie 设置成功"))
}

// 获取 cookie
func getCookieHandler(w http.ResponseWriter, r *http.Request) {
	// 从请求中获取Cookie
	cookie, err := r.Cookie("username")
	if err != nil {
		// 如果没有找到名为 "username" 的Cookie
		w.Write([]byte("未找到Cookie"))
		return
	}
	// 输出Cookie的值
	username := cookie.Value
	fmt.Fprintf(w, "Cookie值为: %s", username)
}

// 删除 cookie
func deleteCookieHandler(w http.ResponseWriter, r *http.Request) {
	deleteCookie := http.Cookie{
		Name:    "username",
		Expires: time.Unix(0, 0),
	}
	http.SetCookie(w, &deleteCookie)
	w.Write([]byte("Cookie已删除"))
}

Session

什么是 session

会话(Session)是在客户端和服务器之间用于存储用户信息的一种机制。在Web开发中,会话用于跟踪用户的状态和数据,因为HTTP协议是无状态的,即每个HTTP请求都是独立的,服务器无法知道两个请求是否来自同一用户。

会话的主要目的是在用户访问网站时维护其状态,通常用于以下方面:

  • 用户认证:在登录后,将用户信息存储在会话中,以便在后续请求中验证用户身份。
  • 购物车:在电子商务网站中,会话可用于跟踪用户购物车的内容。
  • 用户首选项:用户的首选项和设置可以存储在会话中,以在不同页面之间保持一致。
  • 记住我:在用户选择“记住我”的情况下,将会话信息存储在用户的浏览器中,以实现自动登录。

安装库

go get github.com/gorilla/sessions

代码案例

package main

import (
	"github.com/gorilla/sessions"
	"net/http"
)

func main() {
	// 设置HTTP路由和处理程序
	http.HandleFunc("/go", homeHandler)
	http.HandleFunc("/go/set", setSessionHandler)
	http.HandleFunc("/go/get", getSessionHandler)

	// 启动HTTP服务器监听端口 8888
	http.ListenAndServe(":8888", nil)
}


// 创建一个名为 "wangmeili" 的Cookie存储
var store = sessions.NewCookieStore([]byte("wangmeili"))

// 处理主页请求
func homeHandler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Welcome to the home page."))
}

// 处理设置会话的请求
func setSessionHandler(w http.ResponseWriter, r *http.Request) {
	// 从Cookie存储中获取或创建名为 "wangmeili" 的会话
	session, _ := store.Get(r, "wangmeili")

	// 设置会话中的值,例如 "username" 的值为 "john_doe"
	session.Values["username"] = "john_doe"

	// 保存会话到Cookie,并将它发送到客户端
	session.Save(r, w)
	w.Write([]byte("Session set!"))
}

// 处理获取会话值的请求
func getSessionHandler(w http.ResponseWriter, r *http.Request) {
	// 从Cookie存储中获取名为 "wangmeili" 的会话
	session, _ := store.Get(r, "wangmeili")

	// 尝试从会话中获取 "username" 的值
	username, ok := session.Values["username"].(string)

	if !ok {
		w.Write([]byte("Session not found or username not set."))
		return
	}

	w.Write([]byte("Username: " + username))
}

示例演示了如何创建、设置和获取会话数据,以及如何使用gorilla/sessions库来处理Web应用程序中的会话。

请登录后再评论