Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cookies 如何删除cookie_Cookies_Go - Fatal编程技术网

Cookies 如何删除cookie

Cookies 如何删除cookie,cookies,go,Cookies,Go,我编写了一个web应用程序,可以设置cookie并将其删除。为了向场景阐明我的意思,请看下面的代码片段 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 setCo

我编写了一个web应用程序,可以设置cookie并将其删除。为了向场景阐明我的意思,请看下面的代码片段

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的名称、值和过期时间。过期时间已更改,但名称和值未更改

我想要的是,当用户单击“注销”按钮删除cookie时,从浏览器中删除cookie以在身份验证系统中注销。

我也会发现并遵循建议,但并没有按预期工作。

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

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

要删除名为“存储”的cookie,请发送具有相同cookie名称的set cookie

deleteCookieHandler()应如下所示

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

    HttpOnly: true,
}

http.SetCookie(rw, c)

MaxAge=0表示未指定“最大年龄”属性

MaxAge0表示存在并以秒为单位给出的最大年龄属性

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

http.SetCookie(rw, c)

首先,谢谢你的回答。你的意思是,我应该只设置expires字段吗?expires应该足够了是的。设置空或“短”值有助于减少有效负载,并在某些情况下避免数据泄漏。不要使用Expires字段,而是使用负的Max Age。原因:在时钟不同步的情况下,更加理智、更少的通信量。还有一件事需要注意:Cookies不仅按名称键入,还按路径(和域)键入:在删除过程中显式设置。我更改代码。考虑DeleTeCookIEHANDER,我设置最大年龄负,当我调用/删除路径时,最大年龄保持不变,当我在浏览器中查看Cookie时。cookie在过去没有最大年龄。试试这个例子,你就会明白我的意思。我发现,我在deleteCookieHandler函数的末尾忘记了http.SetCookie(rw,c)。实际上,根据mozilla的说法:“cookie过期的秒数。零或负数将立即使cookie过期。如果同时设置了expires和Max Age,Max Age具有优先权。”--请参见此处:@dmaixner根据cookie规范,您是正确的,但在处理golang
http.cookie
struct: