http 之cookie和session

來源:互聯網
上載者:User

標籤:網站   重複   客戶   伺服器   文本   set   cti   turn   border   

 cookie和session

關於http:

1、http是:無狀態、短串連

2、http的請求生命週期:給服務端發送一個請起頭,通過網域名稱提取url,通過路由關係匹配,再通過函數+html進行模板加資料渲染,最後返回給使用者(回應標頭+響應體)

3、http發送規定:

(1)請求:
    get請求:沒有請求體、資料不能超過1k
    post:有請求體,資料大小沒有要求
(2)響應:
    使用者在頁面看到的內容“字串”

 

cookie:

1、cookie的誕生:

cookie不屬於http協議範圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個情境下誕生。

2、cookie的工作原理是:

由伺服器產生內容,瀏覽器收到請求後儲存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣伺服器就能通過cookie的內容來判斷這個是“誰”了。

3、cookie

(1)、是儲存在使用者瀏覽器中的索引值對(可以放很多)
(2)、服務端可以向使用者瀏覽器寫cookie
(3)、用戶端每次請求時,會攜帶cookie

cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支援4096位元組,以及cookie本身儲存在用戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支援更多的位元組,並且他儲存在伺服器,有較高的安全性。這就是session。

問題來了,基於http協議的無狀態特徵,伺服器根本就不知道訪問者是“誰”。那麼上述的cookie就起到橋接的作用。

我們可以給每個用戶端的cookie分配一個唯一的id,這樣使用者在訪問時,通過cookie,伺服器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在伺服器上儲存一段時間的私密資料,如“帳號密碼”等等。

4、cookie的應用:

(1)、投票
(2)、使用者登入
補充:

(1)cookie可以設定逾時時間

(2)總結而言:cookie彌補了http無狀態的不足,讓伺服器知道來的人是“誰”;但是cookie以文本的形式儲存在本地,自身安全性較差;所以我們就通過cookie識別不同的使用者,對應的在session裡儲存私密的資訊以及超過4096位元組的文本。

(3)cookie和session其實是共通性的東西,不限於語言和架構

 

之前我們製作一個登陸頁面,在驗證了使用者名稱和密碼的正確性後跳轉到背景頁面。但是測試後也發現,如果繞過登陸頁面。直接輸入背景url地址也可以直接存取的。這個顯然是不合理的。其實我們缺失的就是cookie和session配合的驗證。有了這個驗證過程,我們就可以實現和其他網站一樣必須登入才能進入後台頁面了。

      先說一下這種認證的機制。每當我們使用一款瀏覽器訪問一個登陸頁面的時候,一旦我們通過了認證。伺服器端就會發送一組隨機唯一的字串(假設是123abc)到瀏覽器端,這個被儲存在瀏覽端的東西就叫cookie。而伺服器端也會自己儲存一下使用者當前的狀態,比如login=true,username=hahaha之類的使用者資訊。但是這種儲存是以字典形式儲存的,字典的唯一key就是剛才發給使用者的唯一的cookie值。那麼如果在伺服器端查看session資訊的話,理論上就會看到如下樣子的字典

{‘123abc‘:{‘login‘:true,‘username:hahaha‘}}

因為每個cookie都是唯一的,所以我們在電腦上換個瀏覽器再登陸同一個網站也需要再次驗證。那麼為什麼說我們只是理論上看到這樣子的字典呢?因為處於安全性的考慮,其實對於上面那個大字典不光key值123abc是被加密的,value值{‘login‘:true,‘username:hahaha‘}在伺服器端也是一樣被加密的。所以我們伺服器上就算開啟session資訊看到的也是類似與以下樣子的東西

{‘123abc‘:dasdasdasd1231231da1231231}

借用一張別的大神畫的圖,可以更直觀的看出來cookie和session的關係

 

cookie樣本:

urls.py

from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^login/‘, views.login),    url(r‘^classes/‘, views.classes),]

 views.py

from django.shortcuts import render,redirect,HttpResponseimport pymysql,jsondef classes(request):    res=request.COOKIES.get("ticket")    print(res)    if not res:        return redirect("/login/")    else:        conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘xyy123‘, db=‘day63‘,charset="utf8")        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)        cursor.execute("select cid,cname from class")        class_list = cursor.fetchall()        cursor.close()        conn.close()        return render(request,"classes.html",{"class_list":class_list})def login(request):    if request.method=="GET":        return render(request,"login.html")    else:        username=request.POST.get("username")        password=request.POST.get("password")        if username=="xuyuanyuan" and password=="xyy123":            obj=redirect("/classes/")            obj.set_cookie("ticket","abcdefg")            return obj        else:            return render(request,"login.html")

login.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><form method="post" action="/login/">    <input type="text" name="username" ><br>    <input type="text" name="password"><br>    <input type="submit" value="提交"></form></body></html>

classes.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><table border="1px" class="table table-striped table-bordered table-hover">        <thead>            <tr>                <th>班級ID</th>                <th>班級名稱</th>            </tr>        </thead>        <tbody>            {% for i in class_list %}            <tr>                <td>{{ i.cid }}</td>                <td>{{ i.cname }}</td>            </tr>            {% endfor %}        </tbody></table></body></html>

其結果展示:

cookie and session設定到期時間樣本:

設定到期時間參數文法:

views.py

from django.shortcuts import render,redirect# Create your views here.import datetimedef login(request):    print("COOKIES",request.COOKIES)    print("SESSION",request.session)    if request.method=="POST":        name=request.POST.get("user")        pwd=request.POST.get("pwd")        if name=="xuyuanyuan" and pwd=="xyy123":            ret = redirect("/index/")            #設定到期時間,max_age 和 expires 時間要設定的一樣。            # ret.set_cookie("username", {"11": "22"})            ret.set_cookie("username", {"11":"22"},max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3))            return ret            #COOKLE SESSION            # request.session["is_login"]=True            # request.session["user"]=name            # return redirect("/index/")    return render(request,"login.html")def index(request):    if request.COOKIES.get("username",None):        name = request.COOKIES.get("username",None)        return render(request, "index.html", locals())    # if request.session.get("is_login",None):    #     name=request.session.get("user",None)    #     return render(request,"index.html",locals())    else:        return redirect("/login/")

  

Session簡介:

 

一、session原理:
用戶端來登入,服務端隨機產生一個字串,給用戶端一份,服務端保留一份,下次用戶端再帶上隨機的字串來訪問時,服務端則根據這個隨機的字串,反饋給用戶端這個字串所對應的values值(當程式需要為某個用戶端的請求建立一個session的時候,伺服器首先檢查這個用戶端的請求裡是否已包含了一個session標識 - 稱為 session id,如果已包含一個session id則說明以前已經為此用戶端建立過session,伺服器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會建立一個),如果用戶端請求不包含session id,則為此用戶端建立一個session並且產生一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個 session id將被在本次響應中返回給用戶端儲存。 )

應用:依賴cookie
作用:保持會話(Web網站)
好處:敏感資訊不會直接給用戶端

 

二、術語session 
session,中文經常翻譯為會話,其本來的含義是指有始有終的一系列動作/訊息,

1、login頁面正確登入的話,後台頁面可以擷取到瀏覽器攜帶的cookie的。

2、第一行的sessionid其實就是cookie值

3、session的內容是加密的,從用戶端擷取不到session的內容

4、服務端可以通過預設的key值取出session的內容並列印到前段

5、django的session預設是儲存在資料庫裡的,我們再到資料庫查看一下真正session內容

 

樣本:

基於session做使用者登入:

urls.py

urlpatterns = [    # ========app01裡的內容=========    url(r‘^admin/‘, admin.site.urls),    url(r‘^login.html$‘, views.login),    url(r‘^index.html$‘, views.index),]

views.py

from django.shortcuts import render,redirect,HttpResponsefrom app01 import modelsdef login(request):    if request.method=="GET":        return render(request,"login.html")    else:        username=request.POST.get("uname")        password=request.POST.get("pwd")        obj=models.Userinfo.objects.filter(username=username,pwd=password).first()        if obj:            # 1. 產生隨機字串            # 2. 通過cookie發送給用戶端            # 3. 服務端儲存            # {            #   隨機字串1: {‘username‘:‘alex‘,‘email‘:x‘‘...}            # }            request.session[‘username‘] = obj.username            return redirect(‘/index.html‘)        else:            return render(request,"login.html",{"msg":"使用者名稱或密碼有誤"})def index(request):    # 1. 擷取用戶端端cookie中的隨機字串    # 2. 去session中尋找有沒有隨機字元    # 3. 去session對應key的value中查看是否有 username    v = request.session.get(‘username‘)    if v:        return HttpResponse(‘登入成功:%s‘ %v)    else:        return redirect(‘/login.html‘)

login.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>使用者登入</h1><form method="post" action="/login.html">    {% csrf_token %}    <div>        使用者名稱:<input type="text" name="uname">    </div>    <div>        密 碼:<input type="password" name="pwd"><br>    </div>    <input type="submit" value="登入">{{ mag }}</form></body></html>

index.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>登入成功</h1></body></html>

 

Django中預設支援Session,其內部提供了5種類型的Session供開發人員使用:

  • 資料庫(預設)
  • 緩衝
  • 檔案
  • 緩衝+資料庫
  • 加密cookie

1、資料庫Session

Django預設支援Session,並且預設是將Session資料存放區在資料庫中,即:django_session 表中。 a. 配置 settings.py     SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘   # 引擎(預設)         SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串(預設)    SESSION_COOKIE_PATH = "/"                               # Session的cookie儲存的路徑(預設)    SESSION_COOKIE_DOMAIN = None                             # Session的cookie儲存的網域名稱(預設)    SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(預設)    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支援http傳輸(預設)    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(預設)    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session到期(預設)    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都儲存Session,預設修改之後才儲存(預設)   b. 使用     def index(request):        # 擷取、設定、刪除Session中資料        request.session[‘k1‘]        request.session.get(‘k1‘,None)        request.session[‘k1‘] = 123        request.session.setdefault(‘k1‘,123) # 存在則不設定        del request.session[‘k1‘]         # 所有 鍵、值、索引值對        request.session.keys()        request.session.values()        request.session.items()        request.session.iterkeys()        request.session.itervalues()        request.session.iteritems()          # 使用者session的隨機字串        request.session.session_key         # 將所有Session失效日期小於當前日期的資料刪除        request.session.clear_expired()         # 檢查 使用者session的隨機字串 在資料庫中是否        request.session.exists("session_key")         # 刪除目前使用者的所有Session資料        request.session.delete("session_key")         request.session.set_expiry(value)            * 如果value是個整數,session會在些秒數後失效。            * 如果value是個datatime或timedelta,session就會在這個時間後失效。            * 如果value是0,使用者關閉瀏覽器session就會失效。            * 如果value是None,session會依賴全域session失效策略。

2、緩衝Session

a. 配置 settings.py     SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘  # 引擎    SESSION_CACHE_ALIAS = ‘default‘                            # 使用的緩衝別名(預設記憶體緩衝,也可以是memcache),此處別名依賴緩衝的設定      SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串    SESSION_COOKIE_PATH = "/"                                # Session的cookie儲存的路徑    SESSION_COOKIE_DOMAIN = None                              # Session的cookie儲存的網域名稱    SESSION_COOKIE_SECURE = False                             # 是否Https傳輸cookie    SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支援http傳輸    SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否關閉瀏覽器使得Session到期    SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次請求都儲存Session,預設修改之後才儲存   b. 使用     同上

3、檔案Session

a. 配置 settings.py     SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘    # 引擎    SESSION_FILE_PATH = None                                    # 快取檔案路徑,如果為None,則使用tempfile模組擷取一個臨時地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T      SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串    SESSION_COOKIE_PATH = "/"                                  # Session的cookie儲存的路徑    SESSION_COOKIE_DOMAIN = None                                # Session的cookie儲存的網域名稱    SESSION_COOKIE_SECURE = False                               # 是否Https傳輸cookie    SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支援http傳輸    SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否關閉瀏覽器使得Session到期    SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次請求都儲存Session,預設修改之後才儲存 b. 使用     同上

4、緩衝+資料庫Session

資料庫用於做持久化,緩衝用於提高效率 a. 配置 settings.py     SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘        # 引擎 b. 使用     同上

5、加密cookie Session

a. 配置 settings.py         SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘   # 引擎 b. 使用     同上

  

總結一下cookie和session的知識點

一、操作Cookie

  擷取cookie:request.COOKIES[key]

  設定cookie:response.set_cookie(key,value)

二、操作Session(session預設在伺服器端儲存15天)

  擷取session:request.session[key]

  設定session:reqeust.session[key] = value

  刪除session:del request.session[key]    

(這個刪除其實就是把資料庫的session_data更新為一個其他的值了,並沒有立即刪除)

request.session.set_expiry(value)* 如果value是個整數,session會在些秒數後失效。* 如果value是個datatime或timedelta,session就會在這個時間後失效。* 如果value是0,使用者關閉瀏覽器session就會失效。* 如果value是None,session會依賴全域session失效策略。

  

 

http 之cookie和session

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.