如何删除cookie

zer*_*ing 8 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)
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

小智 12

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

deleteCookieHandler()应如下所示

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

    HttpOnly: true,
}

http.SetCookie(rw, c)
Run Code Online (Sandbox Code Playgroud)


小智 7

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)
Run Code Online (Sandbox Code Playgroud)

  • @dmaixner 根据 cookie 规范,您是正确的,但是在处理 golang `http.Cookie` 结构时,这个答案是正确的:https://golang.org/src/net/http/cookie.go (2认同)

Tho*_*yer 5

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

保持名称不变,它应该起作用,但不要忘了花一天的时间阅读有关cookie及其工作原理的信息。