Python:Tornado 第二章:實戰演練:開發Tornado網站:第七節:安全Cookie機制

上一篇文章: Python:Tornado 第二章:實戰演練:開發Tornado網站:第六節:異步與協程化
下一篇文章: Python:Tornado 第二章:實戰演練:開發Tornado網站:第八節:用戶身份認證

Cookie是不少網站爲了辨別用戶的身份而存儲在用戶本地終端(Client Side)d的數據,在Tornado中使用RequestHandler.get_cookie()、RequestHandler.set_cookie()能夠方便地對Cookie進行讀寫。web

實例:Cookie的簡單讀寫

import tornado.web

session_id = 1
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        global session_id
        if not self.get_cookie("session"):
            self.set_cookie("session",str(session_id))
            session_id+=1
            self.write("設置新的session")
        else:
            self.write("已經具備session")

if __name__ == '__main__':
    app=tornado.web.Application([
        ("/",MainHandler)
    ])
    app.listen("8888")
    tornado.ioloop.IOLoop.current().start()

本例中用get_cookie()函數判斷Cookie名【session】是否存在,若是不存在則爲其賦予新的session_id.segmentfault

在實際應用中,Cookie常常像本例這樣用於保存session信息。
由於Cookie老是被保存在客戶端,因此如何保存其不被篡改是服務器端程序必須解決的問題。
Tornado爲Cookie提供了信息加密機制,使得客戶端沒法隨意解析和修改Cookie的鍵值。

實例:安全的Cookie

代碼:安全

import tornado.web

session_id = 1
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        global session_id
        #get_secure_cookie代替get_cookie
        if not self.get_secure_cookie("session"):
            #set_secure_cookie代替set_cookie
            self.set_secure_cookie("session",str(session_id))
            session_id+=1
            self.write("設置新的session")
        else:
            self.write("已經具備session")

if __name__ == '__main__':
    app=tornado.web.Application([
        ("/",MainHandler)
    ],cookie_secret="JIA_MI_MI_YAO")
    app.listen("8888")
    tornado.ioloop.IOLoop.current().start()

對比上面的簡單Cookie實例能夠發現不一樣之處:服務器

  • 在tornado.web.Application對象初始化時賦予cookie_secret參數,該參數值時一個字符串,用於保存本網站Cookie加密時的密鑰。
  • 在須要讀取cookie的地方使用RequestHandler.get_secure_cookie代替原來的RequestHandler.get_cookie調用。
  • 在須要寫入Cookie的地方用RequestHandler.set_secure_cookie替換原來的RequestHandler.set_cookie調用,

這樣,就不須要擔憂Cookie僞造的問題了,可是cookie_secret參數值做爲加密密鑰,須要好好保護,不能泄露。cookie

相關文章
相關標籤/搜索