如何删除cookie

时间:2014-12-27 20:13:03

标签: cookies go

我写了一个设置cookie并删除它的Web应用程序。为了澄清方案,我的意思是看下面的代码片段。

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "net/http"
    "time"
)

func rootHandler(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(rw, "Hello Foo")

}

func setCookieHandler(rw http.ResponseWriter, r *http.Request) {
    c := &http.Cookie{
        Name:     "storage",
        Value:    "value",
        Path:     "/",
        MaxAge:   0,
        HttpOnly: true,
    }

    http.SetCookie(rw, c)
}

func deleteCookieHandler(rw http.ResponseWriter, r *http.Request) {

    c, err := r.Cookie("storage")
    if err != nil {
        panic(err.Error())
    }
    c.Name = "Deleted"
    c.Value = "Unuse"
    c.Expires = time.Unix(1414414788, 1414414788000)
}

func readCookieHandler(rw http.ResponseWriter, r *http.Request) {

    c, err := r.Cookie("storage")
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(c.Expires)
}

func evaluateCookieHandler(rw http.ResponseWriter, r *http.Request) {

    c, err := r.Cookie("storage")
    if err != nil {
        panic(err.Error())
    }

    if time.Now().After(c.Expires) {
        fmt.Println("Cookie is expired.")
    }
}

func main() {
    mux := mux.NewRouter()
    mux.HandleFunc("/", rootHandler)
    mux.HandleFunc("/cookie", setCookieHandler)
    mux.HandleFunc("/delete", deleteCookieHandler)
    mux.HandleFunc("/read", readCookieHandler)
    mux.HandleFunc("/eval", evaluateCookieHandler)

    http.ListenAndServe(":3000", mux)
}

如您所见,当我访问/ cookie位置时,将按预期设置cookie。然后当我调用/删除时,它应该更改cookie的名称,值和过期时间。过期时间已更改,但名称和值不会更改。

enter image description here

当用户点击退出按钮删除cookie时,我想要从浏览器中删除用于在身份验证系统中注销的cookie。
我也发现this link并遵循建议,但没有按预期工作。

3 个答案:

答案 0 :(得分:6)

删除名为" storage"的cookie,发送具有相同cookie名称的set-cookie。

deleteCookieHandler()应该如下

c := &http.Cookie{
    Name:     "storage",
    Value:    "",
    Path:     "/",
    Expires: time.Unix(0, 0),

    HttpOnly: true,
}

http.SetCookie(rw, c)

答案 1 :(得分:5)

MaxAge = 0 表示未指定“ Max-Age”属性。

MaxAge <0 表示立即删除Cookie,相当于“ Max-Age:0”

MaxAge> 0 表示存在并以秒为单位给出的Max-Age属性

c := &http.Cookie{
    Name:     "storage",
    Value:    "",
    Path:     "/",
    MaxAge:   -1,
    HttpOnly: true,
}

http.SetCookie(rw, c)

答案 2 :(得分:3)

Cookie是按名称键入的,因此当您“更改”名称时,实际上“创建”了已经过期的其他Cookie。

保持名称相同,它应该有效,但不要忘记花一些时间来阅读有关cookie以及它们如何工作的信息。