本例子主要是演示go语言中关于cookie处理的几个函数,也可以在这里下载
有几点需要注意的,先提前列出来。
-
往客户端写入cookie,需要往respose里写,而不是request,这个很容易混淆,因为request有AddCookie方法,这个看起来就很吸引人使用。而往response的方法是http包里的函数SetCookie 。实际上,request的AddCookie是把http当做客户端的时候使用的。
-
写cookie需要在往response里写入body前进行。特别要注意这个时机问题。
-
删除cookie通过设置cookie的MaxAge为负数来实现。
全部代码如下(请从这里取得最新代码)
测试的话请运行此程序然后在浏览器确认。
package main
import (
"io"
"net/http"
"log"
"fmt"
"time"
)
func DrawMenu(w http.ResponseWriter){
w.Header().Set("Content-Type", "text/html")
io.WriteString(w, "<a href='/'>HOME <ba><br/>" + "\n")
io.WriteString(w, "<a href='/readcookie'>Read Cookie <ba><br/>" + "\n")
io.WriteString(w, "<a href='/writecookie'>Write Cookie <ba><br/>" + "\n")
io.WriteString(w, "<a href='/deletecookie'>Delete Cookie <ba><br/>" + "\n")
}
func IndexServer(w http.ResponseWriter, req *http.Request) {
// draw menu
DrawMenu(w)
}
func ReadCookieServer(w http.ResponseWriter, req *http.Request) {
// draw menu
DrawMenu(w)
// read cookie
var cookie,err = req.Cookie("testcookiename")
if err == nil {
var cookievalue = cookie.Value
io.WriteString(w, "<b>get cookie value is " + cookievalue + "</b>\n")
}
}
func WriteCookieServer(w http.ResponseWriter, req *http.Request) {
// set cookies.
expire := time.Now().AddDate(0, 0, 1)
cookie := http.Cookie{Name: "testcookiename", Value: "testcookievalue", Path: "/", Expires: expire, MaxAge: 86400}
http.SetCookie(w, &cookie)
//
// we can not set cookie after writing something to ResponseWriter
// if so ,we cannot set cookie succefully.
//
// so we have draw menu after set cookie
DrawMenu(w)
}
func DeleteCookieServer(w http.ResponseWriter, req *http.Request) {
// set cookies.
cookie := http.Cookie{Name: "testcookiename", Path: "/", MaxAge: -1}
http.SetCookie(w, &cookie)
// ABOUT MaxAge
// MaxAge=0 means no 'Max-Age' attribute specified.
// MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
// MaxAge>0 means Max-Age attribute present and given in seconds
// draw menu
DrawMenu(w)
}
func main() {
http.HandleFunc("/", IndexServer)
http.HandleFunc("/readcookie", ReadCookieServer)
http.HandleFunc("/writecookie", WriteCookieServer)
http.HandleFunc("/deletecookie", DeleteCookieServer)
fmt.Println("listen on 3000")
err := http.ListenAndServe(":3000", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}