在Go中读取cookie

ezykj2lf  于 2024-01-04  发布在  Go
关注(0)|答案(2)|浏览(107)

我在Go中部署了一个简单的HTTP服务器和一个简单的HTTP客户端。我试图从客户端读取cookie值,但没有成功(我收到一个空值),即使在服务器上我看到的值已经设置好了。我如何从客户端读取cookie值(即通过包含我收到的cookie来发送进一步的请求)?

服务器编码

  1. package main
  2. import (
  3. "log"
  4. "math/rand"
  5. "net/http"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. var SERVER_PORT string = ":8080"
  11. func setCookie(w http.ResponseWriter, username string){
  12. cookieValue := username + ":" + (username+strconv.Itoa(rand.Intn(100000000)))
  13. //expiration := time.Now().Add(365 * 24 * time.Hour)
  14. expiration := time.Now().Add(20 * time.Second)
  15. cookie := http.Cookie{Name:"SessionID", Value: cookieValue, Expires: expiration}
  16. http.SetCookie(w, &cookie)
  17. log.Print(cookie)
  18. }
  19. func sayHello(w http.ResponseWriter, r* http.Request) {
  20. username := r.URL.Path
  21. username = strings.TrimPrefix(username, "/")
  22. setCookie(w,username)
  23. message := "Hello " + username
  24. w.Write([]byte(message))
  25. }
  26. func ReadCookieServer(w http.ResponseWriter, req *http.Request) {
  27. // read cookie
  28. var cookie,err = req.Cookie("SessionID")
  29. if err == nil {
  30. var cookievalue = cookie.Value
  31. w.Write([]byte(cookievalue))
  32. }
  33. }
  34. func main() {
  35. http.HandleFunc("/", sayHello)
  36. http.HandleFunc("/readcookie", ReadCookieServer)
  37. if err := http.ListenAndServe(SERVER_PORT, nil); err != nil {
  38. panic(err)
  39. }
  40. }

字符串

客户代码

  1. package main
  2. import (
  3. "io/ioutil"
  4. "log"
  5. http "net/http"
  6. )
  7. var serverName string = "http://localhost"
  8. var serverPort string = ":8080/"
  9. func MakeRequest() {
  10. var username string = "blabla"
  11. resp, err := http.Get(serverName + serverPort + username)
  12. if err != nil {
  13. log.Fatalln(err)
  14. }
  15. body, err := ioutil.ReadAll(resp.Body)
  16. if err != nil {
  17. log.Fatalln(err)
  18. }
  19. log.Println(string(body))
  20. }
  21. func Readcookie() {
  22. resp, err := http.Get(serverName + serverPort + "readcookie")
  23. if err != nil {
  24. log.Fatalln(err)
  25. }
  26. body, err := ioutil.ReadAll(resp.Body)
  27. if err != nil {
  28. log.Fatalln(err)
  29. }
  30. log.Println(string(body))
  31. }
  32. func main() {
  33. MakeRequest()
  34. Readcookie()
  35. }

nwo49xxi

nwo49xxi1#

如果你想从HTTP请求中读取cookie,你可以使用Cookies方法。示例:

  1. func Readcookie() {
  2. resp, err := http.Get(serverName + serverPort + "readcookie")
  3. if err != nil {
  4. log.Fatalln(err)
  5. }
  6. for _, cookie := range resp.Cookies() {
  7. if cookie.Name == "SessionID" {
  8. log.Println("Cookie: ", cookie.Value)
  9. }
  10. }
  11. body, err := ioutil.ReadAll(resp.Body)
  12. if err != nil {
  13. log.Fatalln(err)
  14. }
  15. log.Println(string(body))
  16. }

字符串
为了实现更大的目标,即跨后续HTTP请求进行会话管理,只需在HTTP客户端上示例化一个cookie jar。示例:

  1. var client *http.Client
  2. func init() {
  3. jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
  4. if err != nil {
  5. panic(err)
  6. }
  7. client = &http.Client{Jar: jar}
  8. }


然后使用此客户端(而不是默认客户端)处理后续请求:

  1. func Readcookie() {
  2. resp, err := client.Get(serverName + serverPort + "readcookie")
  3. if err != nil {
  4. log.Fatalln(err)
  5. }
  6. body, err := ioutil.ReadAll(resp.Body)
  7. if err != nil {
  8. log.Fatalln(err)
  9. }
  10. log.Println(string(body))
  11. }

展开查看全部
ssgvzors

ssgvzors2#

首先,检查客户端是否正在保存cookie。检查浏览器>存储> Cookie。如果客户端正在获取cookie,请记住在客户端请求凭据时启用。

  1. fetch("http://example.com/data.json", {
  2. credentials: "include"
  3. })

字符串
查看更多:https://sabe.io/blog/javascript-pass-cookies-fetch-axios

相关问题