[TOC]
- cookies使用1.基础cookies操作目录结构代码示例2.cookies加密目录结构代码示例
cookies使用
1.基础cookies操作
目录结构
主目录basic
—— main.go —— main_test.go
代码示例
main.go
package mainimport "github.com/kataras/iris"func newApp() *iris.Application { app := iris.New() app.Get("/cookies/{name}/{value}", func(ctx iris.Context) { name := ctx.Params().Get("name") value := ctx.Params().Get("value") ctx.SetCookieKV(name, value) // <-- 设置一个Cookie // 另外也可以用: ctx.SetCookie(&http.Cookie{...}) // 如果要设置自定义存放路径: // ctx.SetCookieKV(name, value, iris.CookiePath("/custom/path/cookie/will/be/stored")) ctx.Request().Cookie(name) //如果您希望仅对当前请求路径可见: //(请注意,如果服务器发送空cookie的路径,所有浏览器都兼容,将会使用客户端自定义路径) // ctx.SetCookieKV(name, value, iris.CookieCleanPath /* or iris.CookiePath("") */) // 学习更多: // iris.CookieExpires(time.Duration) // iris.CookieHTTPOnly(false) ctx.Writef("cookie added: %s = %s", name, value) }) app.Get("/cookies/{name}", func(ctx iris.Context) { name := ctx.Params().Get("name") value := ctx.GetCookie(name) // <-- 检索,获取Cookie //判断命名cookie不存在,再获取值 // cookie, err := ctx.Request().Cookie(name) // if err != nil { // handle error. // } ctx.WriteString(value) }) app.Delete("/cookies/{name}", func(ctx iris.Context) { name := ctx.Params().Get("name") ctx.RemoveCookie(name) // <-- 删除Cookie //如果要设置自定义路径: // ctx.SetCookieKV(name, value, iris.CookiePath("/custom/path/cookie/will/be/stored")) ctx.Writef("cookie %s removed", name) }) return app}func main() { app := newApp() // GET: http://localhost:8080/cookies/my_name/my_value // GET: http://localhost:8080/cookies/my_name // DELETE: http://localhost:8080/cookies/my_name app.Run(iris.Addr(":8080"))}
main_test.go
package mainimport ( "fmt" "testing" "github.com/kataras/iris/httptest")func TestCookiesBasic(t *testing.T) { app := newApp() e := httptest.New(t, app, httptest.URL("http://example.com")) cookieName, cookieValue := "my_cookie_name", "my_cookie_value" // Test Set A Cookie. t1 := e.GET(fmt.Sprintf("/cookies/%s/%s", cookieName, cookieValue)).Expect().Status(httptest.StatusOK) t1.Cookie(cookieName).Value().Equal(cookieValue) // validate cookie's existence, it should be there now. t1.Body().Contains(cookieValue) // Test Retrieve A Cookie. t2 := e.GET(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK) t2.Body().Equal(cookieValue) // Test Remove A Cookie. t3 := e.DELETE(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK) t3.Body().Contains(cookieName) t4 := e.GET(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK) t4.Cookies().Empty() t4.Body().Empty()}
2.cookies加密
目录结构
主目录securecookie
—— main.go —— main_test.go
代码示例
main.go
package main//开发人员可以使用任何库添加自定义cookie编码器/解码器。//在这个例子中,我们使用gorilla的securecookie包:// $ go get github.com/gorilla/securecookie// $ go run main.goimport ( "github.com/kataras/iris" "github.com/gorilla/securecookie")var ( // AES仅支持16,24或32字节的密钥大小。 //您需要准确提供该密钥字节大小,或者从您键入的内容中获取密钥。 hashKey = []byte("the-big-and-secret-fash-key-here") blockKey = []byte("lot-secret-of-characters-big-too") sc = securecookie.New(hashKey, blockKey))func newApp() *iris.Application { app := iris.New() app.Get("/cookies/{name}/{value}", func(ctx iris.Context) { name := ctx.Params().Get("name") value := ctx.Params().Get("value") //加密值 ctx.SetCookieKV(name, value, iris.CookieEncode(sc.Encode)) // <--设置一个Cookie ctx.Writef("cookie added: %s = %s", name, value) }) app.Get("/cookies/{name}", func(ctx iris.Context) { name := ctx.Params().Get("name") //解密值 value := ctx.GetCookie(name, iris.CookieDecode(sc.Decode)) // <--检索Cookie ctx.WriteString(value) }) app.Delete("/cookies/{name}", func(ctx iris.Context) { name := ctx.Params().Get("name") ctx.RemoveCookie(name) // <-- 删除Cookie ctx.Writef("cookie %s removed", name) }) return app}func main() { app := newApp() app.Run(iris.Addr(":8080"))}
main_test.go
package mainimport ( "fmt" "testing" "github.com/kataras/iris/httptest")func TestCookiesBasic(t *testing.T) { app := newApp() e := httptest.New(t, app, httptest.URL("http://example.com")) cookieName, cookieValue := "my_cookie_name", "my_cookie_value" // Test Set A Cookie. t1 := e.GET(fmt.Sprintf("/cookies/%s/%s", cookieName, cookieValue)).Expect().Status(httptest.StatusOK) // note that this will not work because it doesn't always returns the same value: // cookieValueEncoded, _ := sc.Encode(cookieName, cookieValue) t1.Cookie(cookieName).Value().NotEqual(cookieValue) // validate cookie's existence and value is not on its raw form. t1.Body().Contains(cookieValue) // Test Retrieve A Cookie. t2 := e.GET(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK) t2.Body().Equal(cookieValue) // Test Remove A Cookie. t3 := e.DELETE(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK) t3.Body().Contains(cookieName) t4 := e.GET(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK) t4.Cookies().Empty() t4.Body().Empty()}
