2012-08-26 16 views
53

मैं गोलांग के नेट/http के साथ कुकीज़ सेट करने का प्रयास कर रहा हूं। मेरे पासगोलांग में कुकीज़ सेट करना (नेट/http)

package main 

import "io" 
import "net/http" 
import "time" 

func indexHandler(w http.ResponseWriter, req *http.Request) { 
    expire := time.Now().AddDate(0, 0, 1) 
    cookie := http.Cookie{"test", "tcookie", "/", "www.domain.com", expire, expire.Format(time.UnixDate), 86400, true, true, "test=tcookie", []string{"test=tcookie"}} 
    req.AddCookie(&cookie) 
    io.WriteString(w, "Hello world!") 
} 

func main() { 
    http.HandleFunc("/", indexHandler) 
    http.ListenAndServe(":80", nil) 
} 

मैंने 'कुकीज़' के साथ 'गोलांग' googling करने की कोशिश की, लेकिन कोई अच्छा परिणाम नहीं मिला। अगर कोई मुझे सही दिशा में इंगित कर सकता है तो इसकी सराहना की जाएगी।

धन्यवाद।

उत्तर

68

मैं एक गो विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप अनुरोध पर कुकी सेट कर रहे हैं, है ना। आप इसे प्रतिक्रिया पर सेट करना चाहते हैं। नेट/http में setCookie फ़ंक्शन है। यह मदद कर सकता है: http://golang.org/pkg/net/http/#SetCookie

func SetCookie(w ResponseWriter, cookie *Cookie) 
+1

धन्यवाद।ऐसा लगता है कि काम करता है। मैं गलती से http://golang.org/pkg/net/http/#Request.AddCookie को देख रहा था – Tech163

+8

हाँ यह उलझन में है। आपको Request.AddCookie की आवश्यकता होगी यदि आपका गो प्रोग्राम HTTP क्लाइंट के रूप में कार्य करता है और आप HTTP सर्वर पर कुकी मान भेजना चाहते हैं ... –

5

इस कोड को नीचे में मदद करता है यू

cookie1 := &http.Cookie{Name: "sample", Value: "sample", HttpOnly: false} 
    http.SetCookie(w, cookie1) 
8
//ShowAllTasksFunc is used to handle the "/" URL which is the default ons 
func ShowAllTasksFunc(w http.ResponseWriter, r *http.Request){ 
    if r.Method == "GET" { 
     context := db.GetTasks("pending") //true when you want non deleted notes 
     if message != "" { 
      context.Message = message 
     } 
     context.CSRFToken = "abcd" 
     message = "" 
     expiration := time.Now().Add(365 * 24 * time.Hour) 
     cookie := http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration} 
     http.SetCookie(w, &cookie) 
     homeTemplate.Execute(w, context) 
    } else { 
     message = "Method not allowed" 
     http.Redirect(w, r, "/", http.StatusFound) 
    } 
} 

Requests और ResponseWriter के बीच एक बुनियादी अंतर नहीं है, एक अनुरोध क्या एक ब्राउज़र

तरह भेजेंगे
Host: 127.0.0.1:8081 
User-Agent: ... 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
DNT: 1 
Referer: http://127.0.0.1:8081/ 
Cookie: csrftoken=abcd 
Connection: keep-alive 

और एक प्रतिक्रिया हैडलर , भेज देंगे कुछ की तरह:

Content-Type: text/html; charset=utf-8 
Date: Tue, 12 Jan 2016 16:43:53 GMT 
Set-Cookie: csrftoken=abcd; Expires=Wed, 11 Jan 2017 16:43:53 GMT 
Transfer-Encoding: chunked 
<html>...</html> 

ब्राउज़र एक अनुरोध कर देगा है, यह कि डोमेन के लिए कुकी शामिल करेंगे,, यदि आप सेट के बाद से कुकीज़ डोमेन बुद्धिमान जमा हो जाती है और पार डोमेन से पहुँचा नहीं जा सकता एक कुकी केवल HTTP के रूप में तब इसे केवल उस वेबसाइट से एक्सेस किया जा सकता है जो इसे HTTP के माध्यम से सेट करता है और जेएस के माध्यम से नहीं।

तो जब कुकीज़ से जानकारी प्राप्त आप r.Cookie विधि से ऐसा कर सकते हैं, इस

cookie, _ := r.Cookie("csrftoken") 
if formToken == cookie.Value { 

https://github.com/thewhitetulip/Tasks/blob/master/views/addViews.go#L72-L75

की तरह लेकिन जब आप एक कुकी सेट करने जा रहे हैं, तो आप इसे क्या करना है प्रतिक्रिया लेखक विधि में, अनुरोध केवल पढ़ने वाला ऑब्जेक्ट है जिसे हम जवाब देते हैं, इसे किसी टेक्स्ट से प्राप्त टेक्स्ट संदेश के रूप में सोचते हैं, यह एक अनुरोध है, आप केवल इसे प्राप्त कर सकते हैं, जो आप टाइप करते हैं वह एक प्रतिक्रिया है, इसलिए आप

पर एक कुकी में टाइप कर सकते हैं विवरण: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html

-1

आप कुकीज़ से निपटने के लिए गोरिल्ला पैकेज का उपयोग कर सकते हैं या मैं सुरक्षित कुकीज़ कहेंगे: http://www.gorillatoolkit.org/pkg/securecookie

2

नीचे दिखाता है कि कैसे हम अपने उत्पाद में कुकी का उपयोग:

func handleFoo(w http.ResponseWriter, r *http.Request) { 

    // cookie will get expired after 1 year 
    expires := time.Now().AddDate(1, 0, 0) 

    ck := http.Cookie{ 
     Name: "JSESSION_ID", 
     Domain: "foo.com", 
     Path: "/", 
     Expires: expires, 
    } 

    // value of cookie  
    ck.Value = "value of this awesome cookie" 

    // write the cookie to response 
    http.SetCookie(w, &ck) 

    // ... 
} 
0

यह मेरे लिए काम कर रहा था सफारी में जब तक मैंने पथ और मैक्सएज जोड़ा नहीं। दोनों सुरक्षित और नियमित रूप से कुकीज़ मेरे लिए काम किया

शेयरिंग इतना है कि यह कोई है जो अधिक से अधिक 2 दिनों के लिए मेरे जैसे अटक गई है :)

expire := time.Now().Add(20 * time.Minute) // Expires in 20 minutes 
cookie := http.Cookie{Name: "username", Value: "nonsecureuser", Path: "/", Expires: expire, MaxAge: 86400} 
http.SetCookie(w, &cookie) 
cookie = http.Cookie{Name: "secureusername", Value: "secureuser", Path: "/", Expires: expire, MaxAge: 86400, HttpOnly: true, Secure: true} 
http.SetCookie(w, &cookie) 
0

सबसे पहले, आप http पैकेज के setcookie का उपयोग कर कुकी बनाने की जरूरत है और फिर मदद करता है() फ़ंक्शन आप कुकी सेट कर सकते हैं।

expire := time.Now().Add(10 * time.Minute) 
cookie := http.Cookie{Name: "User", Value: "John", Path: "/", Expires: expire, MaxAge: 90000} 
http.SetCookie(w, &cookie)