【问题标题】:How to delete cookie如何删除cookie
【发布时间】:2015-02-24 14:06:59
【问题描述】:

我编写了一个设置 cookie 并将其删除的 Web 应用程序。为了澄清我的意思,请查看以下代码 sn-p。

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。然后当我调用 /delete 时,它​​应该从 cookie 中更改名称、值和过期时间。过期时间已更改,但名称和值不会更改。

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

【问题讨论】:

    标签: cookies go


    【解决方案1】:

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

    保持名称不变,它应该可以工作,但不要忘记花一些时间阅读 cookie 及其工作原理。

    【讨论】:

    • 首先,感谢您的回答。你的意思是,我应该只设置过期字段?
    • Expires 应该足够了。设置一个空值或“短”值有助于减少有效负载并避免在某些情况下泄露数据。
    • 不要使用 Expires 字段,而是使用负的 Max-Age。原因:更理智,更少流量,使用不同步的时钟。还有一点需要注意:Cookie 不仅按名称键控,而且按路径(和域)键控:在删除期间显式设置。
    • 我更改了我的代码gist.github.com/kostonstyle/91d8b8fa87628fa300da。考虑 deleteCookieHandler,我将 max-age 设置为负数,当我调用 /delete 路径时,当我在浏览器中查看 cookie 时,max-age 保持不变。 cookie 过去没有 max-age。试试这个例子,你就会明白我的意思了。
    • 我发现,我在 deleteCookieHandler 函数的末尾忘记了 http.SetCookie(rw, c)。
    【解决方案2】:

    要删除一个名为“storage”的cookie,发送具有相同cookie名称的set-cookie。

    deleteCookieHandler() 应该如下

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

    【讨论】:

      【解决方案3】:

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

      MaxAge 表示现在删除cookie,相当于'Max-Age: 0'

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

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

      【讨论】:

      猜你喜欢
      • 2013-04-04
      • 2011-01-09
      • 2013-07-22
      • 2015-09-26
      • 2013-01-01
      • 2011-04-22
      相关资源
      最近更新 更多