openresty 前端開發進階五之cookie篇
阿新 • • 發佈:2018-12-26
這章主要演示怎麼通過lua操作cookie
操作cookie有兩種方式,一種是直接設定響應頭,另外一種是用lua-resty-cookie庫(其實原理是一樣的,只不過做了一點封裝),這個庫也是春哥寫的,可以放心使用,下面我分別介紹一下兩種方式怎麼用
讀取cookie一(原生)
print(ngx.var.http_cookie) -- 獲取所有cookie,這裡獲取到的是一個字串,如果不存在則返回nil
print(ngx.var.cookie_username) -- 獲取單個cookie,_後面的cookie的name,如果不存在則返回nil
設定cookie一(原生)
ngx.header['Set-Cookie'] = {'a=32; path=/', 'b=4; path=/'} -- 批量設定cookie
ngx.header['Set-Cookie'] = 'a=32; path=/' -- 設定單個cookie,通過多次呼叫來設定多個值
ngx.header['Set-Cookie'] = 'b=4; path=/'
ngx.header['Set-Cookie'] = 'c=5; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 60 * 30) -- 設定Cookie過期時間為30分鐘
熟悉http協議的應該都知道,設定cookie是通過在響應頭中的Set-Cookie欄位來操作的,既然知道原理那上面的程式碼應該就很好理解,其實只要知道怎麼用lua來設定響應頭即可
獲取cookie二(lua-resty-cookie)
local cookie = resty_cookie:new()
local all_cookie = cookie:get_all() -- 這裡獲取到所有的cookie,是一個table,如果不存在則返回nil
print(cjson.encode(all_cookie))
print(cookie:get('c')) -- 獲取單個cookie的值,如果不存在則返回nil
設定cookie二(lua-resty-cookie)
cookie:set({
key = "c",
value = "123456",
path = "/",
domain = "localhost",
expires = ngx.cookie_time(ngx.time() + 60 * 13)
})
OK, 訪問
兩種方式各有各的好處
第一種
優點:
簡單,無依賴
缺點:
太簡單?不夠抽象,太底層?
第二種
優點:
獲取設定都很簡單,簡單的封裝了一層,提供了更有表現力的api介面
缺點:
多引入一個庫,其實也不算什麼缺點
看情況而定吧,假如cookie操作得比較少的話,可以用第一種,假如操作得比較多,可以考慮用第二種,編碼比較統一
示例程式碼 參見demo12部分