使用gin,gin-contrib/sessions不同request path獲取不到session
gin session problem
從開發環境中抽出來了 sample code,https://github.com/dockerq/gin-session-problem,歡迎下載測試、重現問題。
環境
- gin 版本
{ "checksumSHA1": "86tapazS8gfJ5JRCxVNTTDkUZwM=", "path": "github.com/gin-gonic/gin", "revision": "bbd4dfee5056087c640a75c6cc21567f4f47585d", "revisionTime": "2017-07-12T07:01:46Z" }
- golang 1.8.0
-
gin 中設定 session 程式碼
r := gin.Default() store := sessions.NewCookieStore([]byte("secret")) store.Options(sessions.Options{ MaxAge: int(30 * time.Minute), //30min Path: "/", }) r.Use(sessions.Sessions("mysession", store)) r.GET("/pre", preSession) r.GET("/do", DoSomethine) r.Run(":8081") fmt.Println("start api server success.")
-
preSession(這個函式目的是向啟動的 gin.Engine 中新增一條 session 記錄)
func preSession(c *gin.Context) { session := sessions.Default(c) session.Set("test@mail.com", "test.access.token") session.Save() c.JSON(http.StatusOK, nil) }
-
DoSomethine 函式接受 email 引數,讀取 session 中對應 email 的 value
func DoSomethine(c *gin.Context) { userEmail := c.Query("user_email") if userEmail == "" { panic("can not get user email") } session := sessions.Default(c) userAccessToken := session.Get(userEmail) fmt.Printf("[DoSomethine] user access token is %s\n", userAccessToken) c.JSON(http.StatusOK, nil) }
-
測試方法,先呼叫 getPreSession() 設定一條 session,然後訪問
/do
檢視是否拿到 session。func TestSession(t *testing.T) { StartTestServer(t) getPreSession() u := url.Values{} u.Set("user_email", "test@mail.com") testUrl := apiBaseUrl + "/do?" + u.Encode() fmt.Printf("test url is %s\n", testUrl) resp, err := http.Get(testUrl) defer resp.Body.Close() if err != nil { t.Error(err) } fmt.Println(resp.StatusCode) }
-
結果,注意[DoSomethine] user access token is %! s(<nil>)表明沒有拿到 session。
➜ session make test go test --cover -test.v === RUN TestSession cookie of pre session request is [mysession=MTUwMTgxNDYxNnxEdi1CQkFFQ180SUFBUkFCRUFBQU9QLUNBQUVHYzNSeWFXNW5EQThBRFhSbGMzUkFiV0ZwYkM1amIyMEdjM1J5YVc1bkRCTUFFWFJsYzNRdVlXTmpaWE56TG5SdmEyVnV8cc0AwUddF90uWUxOF8BONUo-tFGouRdSOfj62m9U8sE=; Path=/; Expires=Wed, 09 Jan 1771 04:16:32 GMT; Max-Age=1800000000000] test url is http://0.0.0.0:8081/do?user_email=test%40mail.com [DoSomethine] user access token is %!s(<nil>) [GIN] 2017/08/04 - 10:43:36 | 200 | 99.642µs | 127.0.0.1 | GET /do 200 --- PASS: TestSession (2.00s) main_test.go:36: waiting 2 second for server startup PASS coverage: 48.0% of statements ok ginlab/session 2.010s
問題
為什麼/pre
設定 session 後,請求/do
卻拿不到 session?是沒 session 沒有配置正確還是其它原因?
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- request 獲取不到 CookieCookie
- STRUTS2獲得session和requestSession
- 當laravel獲取不到session的三種解決辦法LaravelSession
- WebApi和Mvc的Session一直獲取不到問題WebAPIMVCSession
- SSL認證 request.getScheme() 獲取不到https的問題SchemeHTTP
- Laravel request 獲取路由引數Laravel路由
- SSH獲取SESSION時報NullPointExceptionSessionNullException
- SpringMVC中servletFileUpload.parseRequest(request)解析為空獲取不到資料問題SpringMVCServlet
- Jmeter系列(31)- 獲取並使用 JDBC Request 返回的資料JMeterJDBC
- $request 請求方法 獲取 API 的當前使用者API
- 【SESSION】v$session and v$license 中sessions_current 的區別Session
- 從session中獲取資料Session
- 【Struts2】Session的獲取Session
- request的請求引數獲取方式
- 獲取request中的查詢引數
- PHP - 獲取和設定include_path .PHP
- 怎麼能接聽來電?獲取不到不到元素
- Session store not set on request.Session
- Laravel - Session store not set on requestLaravelSession
- hudson獲取不到最新的程式碼
- 不同使用者,不同的session超時時間Session
- laravel symfony request獲取真實ip的坑Laravel
- python request 獲取cookies value值的方法PythonCookie
- Node.js Express 獲取request原始資料Node.jsExpress
- 從request獲取各種路徑總結
- 獲取指定pid的session的pga/uga使用情況Session
- Request.ServerVariables,C#獲取伺服器資訊,C#獲取訪問資訊ServerC#伺服器
- android中HttpClient獲取Session然後使用 WebView共享session的解決辦法(轉)AndroidHTTPclientSessionWebView
- Laravel 中 $request 獲取請求資訊 用法 總結Laravel
- java web 通過request獲取客戶端IPJavaWeb客戶端
- springcloud fegin獲取request header解決方案SpringGCCloudHeader
- struts之Action中獲取request、response物件的方法物件
- Grails通過sessionId獲取session物件AISession物件
- SpringMVC - controller中獲取sessionSpringMVCControllerSession
- 關於filter獲取session的問題!!!FilterSession
- gin框架獲取請求引數的8大方式框架
- VC++獲取不同Windows版本的方法C++Windows
- 為啥從SurfaceView中獲取不到圖片?View