使用cookie实现闪现消息
程序员文章站
2022-06-11 22:34:08
...
package main
import (
"encoding/base64"
"fmt"
"net/http"
"time"
)
func setMessage(w http.ResponseWriter, r *http.Request) {
msg := []byte("Hello World!")
c := http.Cookie{
Name:"flash",
Value:base64.URLEncoding.EncodeToString(msg),
}
http.SetCookie(w, &c)
}
func showMessage(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("flash")
if err != nil {
if err == http.ErrNoCookie {
fmt.Fprintln(w, "No message found")
}
} else {
rc := http.Cookie{
Name:"flash",
MaxAge:-1,
Expires:time.Unix(1, 0),
}
http.SetCookie(w, &rc)
val, _ := base64.URLEncoding.DecodeString(c.Value)
fmt.Fprintln(w, string(val))
}
}
func main() {
server := http.Server{
Addr:"127.0.0.1:8080",
}
http.HandleFunc("/set_message", setMessage)
http.HandleFunc("/show_message", showMessage)
server.ListenAndServe()
}
showMessage函数的定义:
这个函数首先会尝试获取指定的cookie,如果没有找到该cookie,它就会把变量err设置成一个http.ErrNoCookie值,并向浏览器返回一条“No message found”消息。如果找到了这个cookie,那么它必须完成以下两个操作:
(1)创建一个同名的cookie,将它的MaxAge值设置为负数,并且将Expires值也设置成一个已经过去的时间;
(2)使用SetCookie方法将刚刚创建的同名cookie发送至客户端。
初看上去,这两个操作的目的似乎是要替换已经存在的cookie,但实际上,因为新cookie的MaxAge值为负数,并且Expires值也是一个已经过去的时间,所以这样做实际上就是要完全地移除这个cookie。在设置完新cookie之后,程序会对存储在旧cookie中的消息进行解码,并通过响应返回这条消息。