2014-12-27 2 views
3

Я написал веб-приложение, которое устанавливает куки-файл и удаляет его. Чтобы уточнить сценарий, я имею в виду следующий фрагмент кода.Как удалить 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. Истекшее время изменяется, но имя и значение нет.

enter image description here

Что я хочу, чтобы удалить куки из браузера для знака в системе аутентификации, когда пользователь нажимает кнопку выйти, чтобы удалить куки.
Я также обнаруживаю this link и следую советам, но не работает должным образом.

ответ

3

Cookies вводятся по имени, поэтому, когда вы «меняете» имя, вы на самом деле «создаете» другой файл cookie, который уже истек.

Сохраните это имя, и оно должно работать, но не забудьте занять некоторое время в течение одного дня, чтобы прочитать о куках и о том, как они работают.

+0

Прежде всего, спасибо за ответ. Вы имеете в виду, что я должен установить только срок действия поля? –

+0

Истекает должно быть достаточно. Установка пустого или «короткого» значения помогает сократить полезную нагрузку и избежать утечки данных в некоторых случаях. –

+0

Не используйте поле Expires, вместо этого используйте отрицательный Max-Age. Причина: гораздо более здравый, меньше трафика, работает с несинхронизированными часами. Еще одна вещь, на которую нужно обратить внимание: Cookies не только связаны по имени, но и по пути (и домену): задайте явно во время удаления. – Volker

2

Чтобы удалить файл cookie с именем «storage», отправьте set-cookie с тем же именем файла cookie.

deleteCookieHandler() должен быть следующим

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

    HttpOnly: true, 
} 

http.SetCookie(rw, c)