Ajax(二)

來源:互聯網
上載者:User

標籤:import   語言   測試   原理   pass   error:   file   common   ati   

COOKIE 與 SESSION簡介

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

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

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

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

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

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

4、另外,上述所說的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
def foo(request):    print(request.COOKIES)    obj=redirect("/path/")    obj=HttpResponse("content")    obj=render(request,"html")    obj.set_cookie("key","value",max_age=60,path="/path/")    obj.set_signed_cookie("key","value",max_age=60,path="/path/",salt="egonnb")    request.get_signed_cookie("key",salt="egonnb");    return obj
SESSION 

先在templates目錄下建立兩個html,login.html負責登入頁面。backend頁面代表後台頁面

login.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>login</title>    <link rel="stylesheet" href="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/css/bootstrap.min.css"></head><body>    <div class="container">        <form action="login.html" method="post">            <div class="form-group">                <label class="sr-only">username</label>                <input type="text" class="form-control" name="username" placeholder="使用者名稱"/>            </div>            <div class="form-group">                <label class="sr-only">Password</label>                <input type="password" class="form-control" name="passwd" placeholder="密碼"/>            </div>            <div class="form-group">                <input class="btn btn-primary" type="submit" value="http://830909.blog.51cto.com/8311014/Submit">            </div>        </form></div><script type="application/Javascript" src="http://830909.blog.51cto.com/static/js/jquery-2.2.1.min.js"></script><script type="application/javascript" src="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script></body></html>

backend.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>backend</title>    <link rel="stylesheet" href="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/css/bootstrap.min.css">    <link rel="stylesheet" href="http://830909.blog.51cto.com/static/css/commons.css"></head><body><div class="container">    <h2>cookie 內容是 {{ cookie_content }}</h2>    <h2>session 內容是 {{ session_content }}</h2>    <h2>登入使用者名稱 :{{ username }}</h2>    <a href="http://830909.blog.51cto.com/logout/">登出</a></div><script type="application/javascript" src="http://830909.blog.51cto.com/static/js/jquery-2.2.1.min.js"></script><script type="application/javascript" src="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script></body></html>

第二步 編輯app01應用下的views.py檔案,編寫代碼邏輯部分

views.py

# /usr/bin/env python# coding:utf-8from django.shortcuts import renderfrom django.shortcuts import redirectdef login(request):    if request.method=="POST":        username=request.POST[‘username‘]        pwd=request.POST[‘passwd‘]        if username==‘abc‘ and pwd==‘123‘:            #設定session內部的字典內容            request.session[‘is_login‘]=‘true‘            request.session[‘username‘]=‘abc‘            #登入成功就將url重新導向到背景url            return redirect(‘/backend/‘)    #登入不成功或第一訪問就停留在登入頁面    return render(request,‘login.html‘)def backend(request):    """    這裡必須用讀取字典的get()方法把is_login的value預設設定為False,    當使用者訪問backend這個url先嘗試擷取這個瀏覽器對應的session中的    is_login的值。如果對方登入成功的話,在login裡就已經把is_login    的值修改為了True,反之這個值就是False的    """    is_login=request.session.get(‘is_login‘,False)    #如果為真,就說明使用者是正常登陸的    if is_login:        #擷取字典的內容並傳入分頁檔        cookie_content=request.COOKIES        session_content=request.session        username=request.session[‘username‘]        return render(request,‘backend.html‘,                      {            ‘cookie_content‘:cookie_content,            ‘session_content‘:session_content,            ‘username‘:username                      })    else:        """        如果訪問的時候沒有攜帶正確的session,        就直接被重新導向url回login頁面        """        return redirect(‘/login/‘)def logout(request):    """    直接通過request.session[‘is_login‘]回去返回的時候,    如果is_login對應的value值不存在會導致程式異常。所以    需要做異常處理    """    try:        #刪除is_login對應的value值        del request.session[‘is_login‘]    except KeyError:        pass    #點擊登出之後,直接重新導向回登入頁面    return redirect(‘/login/‘)

第三步,編輯mydjango目錄下的urls.py檔案。設定函數與頁面的綁定關係

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‘^backend/‘, views.backend),    url(r‘^logout/‘, views.logout),]

最後開啟瀏覽器直接存取/backend/頁面的時候直接就被重新導向到了/login/

只有在輸入了正確的使用者名稱和密碼之後才進入到了/backend/頁面

從中我們看到有一下幾點:

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

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

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

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

從Firefox瀏覽器裡查看cookie

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

從中我們看到有一下幾點:

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

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

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

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

從Firefox瀏覽器裡查看cookie

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

下面我們再來最後的總結一下cookie和session的知識點

cookie:

# 1、擷取Cookie:# request.COOKIES[‘key‘]# request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None)#     參數:#         default: 預設值#            salt: 加密鹽#         max_age: 後台控制到期時間# 2、設定Cookie:# rep = HttpResponse(...) 或 rep = render(request, ...)## rep.set_cookie(key,value,...)# rep.set_signed_cookie(key,value,salt=‘加密鹽‘,...)#     參數:#         key,              鍵#         value=‘‘,         值#         max_age=None,     逾時時間#         expires=None,     逾時時間(IE requires expires, so set it if hasn‘t been already.)#         path=‘/‘,         Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問#         domain=None,      Cookie生效的網域名稱#         secure=False,     https傳輸#         httponly=False    只能http協議傳輸,無法被JavaScript擷取(不是絕對,底層抓包可以擷取到也可以被覆蓋)# 由於cookie儲存在用戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。# <script src=‘/static/js/jquery.cookie.js‘></script># $.cookie("list_pager_num", 30,{ path: ‘/‘ });
View Code

session:

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")         ...
View Code

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. 使用     同上
View Code

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. 使用     同上
View Code

4、緩衝+資料庫Session

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

5、加密cookie Session

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

擴充:Session使用者驗證

def login(func):    def wrap(request, *args, **kwargs):        # 如果未登陸,跳轉到指定頁面        if request.path == ‘/test/‘:            return redirect(‘http://www.baidu.com‘)        return func(request, *args, **kwargs)    return wrap
View Code

Ajax(二)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.