cookie與session組件

 

#cookie
是由瀏覽器維持,存儲在客戶端的一小段文本信息。用戶每次訪問站點時,web服務均可以讀取cookie中的信息
cookie根據生命週期分爲會話cookie和持久cookie。//todo

#session
中文翻譯爲會話。在服務器上保存用戶操做的歷史信息。服務器會使用相似散列表的結構保存信息,每個網站客戶都會被分配一個惟一的標識符sessionID,它能夠經過url傳遞,或者保存在客戶端的cookie中。

服務器爲某個客戶端請求建立一個session時,會先檢查客戶端的請求裏是否包含sessionID, 若是包含,說明已經建立過session,服務器按照sessionID將session檢索出來使用; 若是客戶端請求不包含sessionID,則爲此服務建立一個session並同時生成一個與此session定向管理的sessionID,在本次的響應中返回給客戶端。

通常sessionID存放在cookie中。Cookie和Session經過一個sessionID創建起瀏覽器和服務器之間的鏈接。

#爲何使用它們
web開發中,http協議是無狀態的,可使用cookie和session肯定哪些鏈接是和該用戶相關

#session和cookie的區別
1.cookie把數據存儲在客戶端(網站的客戶端是瀏覽器),session把數據存儲在服務器。
2.session數據的安全係數比cookie高。
3.生命週期不一樣,通常是用臨時session,生命週期是隨着瀏覽器關閉而結束,cookie的生命週期是能夠設置的,隨着設置時間的結束而結束。

#總結:
Session和cookie的目的相同,都是爲了克服HTTP協議的無狀態缺陷,但完成方法不一樣。Session經過cookie,在客戶端保存sessionID,而將用戶的其餘會話消息保存在服務端的session對象中,與此相對的,cookie須要將全部信息都保存在客戶端。所以cookie存在這必定的安全隱患。

#什麼是token
token的意思是「令牌」,是服務端生成的一串字符串,做爲客戶端進行請求的一個標識。
當用戶第一次登陸後,服務器生成一個token並將此token返回給客戶端,之後客戶端只需帶上這個token前來請求數據便可,無需再次帶上用戶名和密碼。
簡單token的組成;uid(用戶惟一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以哈希算法壓縮成的必定長度的十六進制字符串。爲防止token泄露)。
cookie,session.token

 

 

1、cookie基本介紹

#一、cooike的由來
    由於HTTP是無狀態的,每次請求都是獨立的,它的執行狀況和結果與前面的請求和以後的請求都無直接關係,它不會受前面的請求響應狀況直接影響,也不會直接影響後面的請求響應狀況。
    會話中產生的數據又是咱們須要保存的,也就是說要「保持狀態」。所以Cookie就是在這樣一個場景下誕生。


#二、什麼是cooike
     Cookie是由服務器建立,存儲在瀏覽器上的K,V鍵值對


#三、cooike規範
    # Cookie大小上限爲4KB; 
    # 一個服務器最多在客戶端瀏覽器上保存20個Cookie; 
    # 一個瀏覽器最多保存300個Cookie; 
    可是,瀏覽器大戰的今天,一些瀏覽器對Cookie規範「擴展」了一些,

    #注意,不一樣瀏覽器之間是不共享Cookie的

#四、Cookie的覆蓋 
    若是服務器端發送重複的Cookie那麼會覆蓋原有的Cookie
cooike瞭解知識點

 

2、Cookie的基本使用

一、設置cookie

#key, 鍵
#value='', 值
#max_age=None, 
    傳一個秒的時間,例如:max_age=60*60*24*6,       6天
#expires=None, 
    超時時間(傳一個datatime對象)
#path='/', 
    Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie能夠被任何url的頁面訪問,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣能夠避免將cookie傳給站點中的其餘的應用。

#domain=None,
     Cookie生效的域名 你可用這個參數來構造一個跨站cookie。如,             domain=".example.com"所構造的cookie對下面這些站點都是可讀的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 若是該參數設置爲 None ,cookie只能由設置它的站點讀取

#secure=False,
     瀏覽器將經過HTTPS來回傳cookie
#httponly=False
     只能http協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)

 

#HttpResponse對象均可以設置

rep = HttpResponse(‘ok')
rep = render(request, ...)

rep.set_cookie(key,value)
rep.set_signed_cookie(key,value,salt='加密鹽')

#不加鹽
set_cookie(key,value)

def get_cookie(request):
    obj = HttpResponse('ok')
    obj.set_cookie('name','pdun')
    return obj

#加鹽
obj.set_signed_cookie('name','pdun',salt='123')

#把salt加密後放到冒號後邊
    name=pdun:1haqZh:TGY_X30GGFUPLC1SE6Sl18g7aSU
View Code

 

 

二、獲取cookie

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)     #加密時有salt
 
#參數:
    default: 默認值
    salt: 加密鹽
    max_age: 後臺控制過時時間

 

 

三、刪除Cookie

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 刪除用戶瀏覽器上以前設置的usercookie值
    return rep

 

Cookie版登陸校驗

def login_auth(func):
    def inner(request,*args,**kwargs):
        next_url=request.get_full_path()
        if request.COOKIES.get('is_login'):
            return func(request,*args,**kwargs)
        else:
            return redirect('cookie_login/?next=%s'%next_url)
    return inner
@login_auth
def cookie_order(request):
    return HttpResponse('我是訂單頁面')
@login_auth
def cookie_index(request):
    name=request.COOKIES.get('username')
    return render(request,'cookie_index.html',{'name':name})
def cookie_login(request):
    if request.method =='POST':
        next_url=request.GET.get('next')
        name=request.POST.get('name')
        password=request.POST.get('password')
        if name == 'lqz' and password == '123':
            import datetime
            now=datetime.datetime.now().strftime('%Y-%m-%d %X')
            print(now)
            obj=redirect(next_url)
            obj.set_cookie('is_login',True)
            obj.set_cookie('username',name)
            obj.set_cookie('login_time',now)
            return obj

    return render(request, 'cookie_login.html')
登陸認證裝飾器

 

3、Session的基本介紹

什麼是session

#存在服務器上的鍵值對       {'隨機字符串':{name:pdun,pwd:123}} 
解決cookie不安全的問題,
用session必須跟cookie連用

Django中Session基本使用

設置值

request.session['name']='pdun'
request.session['age']='1'

#若是設置多個,它會以字典的形式存儲到session表中的session_data中
#django自動建立session表



#生成session時,django框架會作三件事
    1 生成隨機字符串(一個瀏覽器對應一個)
    2 取數據庫存儲         
    3 將隨機字符串寫到瀏覽器的cookie中(session_id)
            寫入cookie(set_cookie('sessionid','dfasfasdfa'))    

取值

#取值
    name=request.session['name']
#執行流程:
    取到cookie的隨機字符串
    取session表中根據隨機字符串查詢,查詢出session_data這個字典,而後把字典中name返回

 刪除值

# 只是刪除數據庫部分的內容
    request.session.delete()
#既刪除cookie,又刪除數據庫
    request.session.flush()

 

 

 

# 獲取、設置、刪除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()

# 取到隨機字符串,瀏覽器帶過來的cookie的值
request.session.session_key

# 清除失效的session
request.session.clear_expired()

# 檢查會話session的key在數據庫中是否存在
request.session.exists("session_key")

# 刪除當前會話的全部Session數據(只刪數據庫)
request.session.delete()
  
# 刪除當前的會話數據並刪除會話的Cookie(數據庫和cookie都刪)。
request.session.flush() 
    這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
    例如,django.contrib.auth.logout() 函數中就會調用它。

# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
    * 若是value是個整數,session會在些秒數後失效。
    * 若是value是個datatime或timedelta,session就會在這個時間後失效。
    * 若是value是0,用戶關閉瀏覽器session就會失效。
    * 若是value是None,session會依賴全局session失效策略。

 

 

Django中的Session配置

1. 數據庫Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)

2. 緩存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 

4. 緩存+數據庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其餘公用設置項:
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,默認修改以後才保存(默認)

思考,若是第二我的再次再同一個瀏覽器上登陸,django-session表會怎樣?html

 

 

CBV中加裝飾器

from django import views
from django.utils.decorators import method_decorator
# @method_decorator(login_auth,name='get')
# @method_decorator(login_auth,name='post')
class UserList(views.View):
    # @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        obj=super().dispatch(request, *args, **kwargs)
        return obj

    @method_decorator(login_auth)
    def get(self,request):
        return HttpResponse('我是用戶列表')

    def post(self,request):
        return HttpResponse('我是用戶列表')

 

 

 

前端存取cooike

vuex:狀態管理器

若是沒有安裝,
#一、安裝
    npm install vues

#二、在src中建立store.js文件

#三、在main.js中註冊
new Vue({
  router,
  store,



----------------------------
import Vue from 'vue'
import Vuex from 'vuex'
import Cookie from 'vue-cookies'      //下載cookies並導入
Vue.use(Vuex)

export default new Vuex.Store({
    //存儲全局變量
    state: {
        //name:''      
        //pwd:''       

#這裏至關於全局變量,後邊給它賦值,後邊取值,可是登錄一次後,刷新頁面,須要從新登錄
vuex:狀態管理器

 

npm install vue-cookies



---------------------------
#store.js
import Cookie from 'vue-cookies'      //下載cookies並導入
export default new Vuex.Store({

    state: {
        //不要寫死,要從cookie中取
        name: Cookie.get('name'),
        token: Cookie.get('token')

    },
    mutations: {
        //    寫方法,這裏面寫的全部方法,第一個參數,必須是state
        //login這個方法寫好了,怎麼調用, _this.$store.commit('login',response),
        // 就用commit第一個參數,就是這裏的函數名,第二個參數是這裏須要的參數
        login:function (state,response) {
            //修改這兩個變量的值
            state.name=response.data.name
            state.token=response.data.token
        //    往cookie中寫數據
            Cookie.set('name',response.data.name)
            Cookie.set('token',response.data.token)
        },
        logout:function (state) {
            //修改這兩個變量的值
            state.name=""
            state.token=""
        //    往cookie中寫數據
            Cookie.set('name',"")
            Cookie.set('token',"")
        }


    },
    actions: {}
})
vue-cookies
相關文章
相關標籤/搜索