cookies與session

cookies與session的關係

cookies

在網站中,http請求是無狀態的。也就是說即便第一次和服務器鏈接後而且登陸成功後,第二次請求服務器依然不能知道當前請求是哪一個用戶。cookie的出現就是爲了解決這個問題,第一次登陸後服務器返回一些數據(cookie)給瀏覽器,而後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器經過瀏覽器攜帶的數據就能判斷當前用戶是哪一個了。cookie存儲的數據量有限,不一樣的瀏覽器有不一樣的存儲大小,但通常不超過4KB。所以使用cookie只能存儲一些小量的數據。css

session

session和cookie的做用有點相似,都是爲了存儲用戶相關的信息。不一樣的是,cookie是存儲在本地瀏覽器,而session存儲在服務器。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有必定的弊端,就是會佔用服務器的資源,但如今服務器已經發展至今,一些session信息仍是綽綽有餘的。html

二者傳輸的關係

1.客戶端第一請求,服務端會發送登錄頁面過去jquery

2.客戶第二次請求並提交用戶名和密碼後,服務端會向客戶端回寫一個cookie值數據庫

3.若是咱們設置了session,則會向客戶端回寫一個 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'},它會保存在客戶端django

4.服務端會將客戶的隱私信息保存在了服務端的數據庫中, 也就是session保存在了數據庫中,默認放在django_session表中:{"dsjnalndjskanjdksa" : {"name":'jojo', 'age':12, 'addr':'dsabdsa'}},也就是以session值:用戶信息的形式存儲bootstrap

5.咱們能夠理解爲cookie的value值就是session的key,當咱們再次向服務端發起請求時,服務端會經過sessionid來比對信息,而後返回用戶信息瀏覽器

Cookie

#設置cookie
obj = redirect('/home/')
obj.set_cookie('username','hank666')

#刪除cookie
#obj.delete_cookie('username')

#獲取cookie
request.COOKIES.get('username')

實現cookie登陸方式一

views.py安全

def login(request):
    if request.method =='POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'hank' and password == '123':
            #保存用戶登陸狀態
            obj = redirect('/home/')
            #設置cookie
            obj.set_cookie('username','hank666')
            return obj
    return render(request,'login.html')

def home(request):
    # 校驗瀏覽器是否有對應的cookie
    if request.COOKIES.get('username'):
        print(request.COOKIES)
        return HttpResponse('我是home頁面,只有登陸的用戶才能訪問')
    else:
        return redirect('/login/')

實現cookie登陸方式二 (裝飾器)

def login_auth(func):
    def inner(request,*args,**kwargs):
        #print('request.path_info:', request.path_info)  # 只拿路徑部分 不拿參數
        #print('request.get_full_path():', request.get_full_path())  # 路徑加參數

        # 執行被裝飾函數以前爲其裝上新功能
        if request.COOKIES.get('username'):
            res = func(request,*args,**kwargs)
            return res
        else:
            return redirect('/login/')
    return inner

def login(request):
    if request.method =='POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'hank' and password == '123':
            #保存用戶登陸狀態
            obj = redirect('/home/')
            #設置cookie
            obj.set_cookie('username','hank666')
            return obj
    return render(request,'login.html')

@login_auth
def home(request):
    # 校驗瀏覽器是否有對應的cookie
    # if request.COOKIES.get('username'):
    #     print(request.COOKIES)
    #     return HttpResponse('我是home頁面,只有登陸的用戶才能訪問')
    # else:
    #     return redirect('/login/')
    return HttpResponse('我是home頁面,只有登陸的用戶才能訪問')

@login_auth
def index(request):
    return HttpResponse('我是index頁面,只有登陸的用戶才能訪問')

@login_auth
def demo(request):
    return HttpResponse('我是demo頁面,只有登陸的用戶才能訪問')

cookie登陸方式二改進版 (裝飾器)

def login_auth(func):
    def inner(request,*args,**kwargs):
        #print('request.path_info:', request.path_info)  # 只拿路徑部分 不拿參數
        #print('request.get_full_path():', request.get_full_path())  # 路徑加參數

        # 執行被裝飾函數以前爲其裝上新功能
        target_url = request.path_info
        if request.COOKIES.get('username'):
            res = func(request,*args,**kwargs)
            return res
        else:
            return redirect('/login/?next=%s' %target_url)
    return inner

def login(request):
    if request.method =='POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'hank' and password == '123':
            # target_url = request.GET.get('next','/home/')
            target_url = request.GET.get('next')
            #判斷用戶登陸以前是否有想要訪問的url
            if target_url:
                obj = redirect(target_url)
            else:
                obj =redirect('/home/')
            #保存用戶登陸狀態
            #設置cookie
            obj.set_cookie('username','hank666')
            return obj
    return render(request,'login.html')

@login_auth
def home(request):
    return HttpResponse('我是home頁面,只有登陸的用戶才能訪問')

@login_auth
def index(request):
    return HttpResponse('我是index頁面,只有登陸的用戶才能訪問')

@login_auth
def demo(request):
    return HttpResponse('我是demo頁面,只有登陸的用戶才能訪問')

@login_auth
def logout(request):
    obj = HttpResponse('註銷了')
    obj.delete_cookie('username')
    return obj

login.html服務器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post">
    <p>username: <input type="text" name="username"></p>
    <p>password: <input type="text" name="password"></p>
    <input type="submit">
</form>    
</body>
</html>

注意:cookie

session

Django設置session

request.session['key'] = value
    """
    1.django內部會自動生成一個隨機字符串
    2.去django_session表中存儲數據 鍵就是隨機字符串 值是要保存的數據(中間件乾的)
    3.將生成好的隨機字符串返回給客戶端瀏覽器   瀏覽器保存鍵值對
        sessionid  隨機字符串
    """            

獲取session

request.session.get('key')
        """
    1.django會自動取瀏覽器的cookie查找sessionid鍵值對 獲取隨機字符串
    2.拿着該隨機字符串取django_session表中比對數據
    3.若是比對上了 就將隨機字符串對應的數據獲取出來並封裝到request.session供用戶調用
    """

刪除當前會話的全部session數據

request.session.delete()

刪除當前的會話數據並刪除會話的Cookie(推薦使用)

request.session.flush()
    這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
    例如,django.contrib.auth.logout() 函數中就會調用它。

注意:django中默認的session超時時間爲14天

設置會話Session和Cookie的超時時間

request.session.set_expiry(value)
    * 若是value是個整數,session會在些秒數後失效。
    * 若是value是個datatime或timedelta,session就會在這個時間後失效。
    * 若是value是0,用戶關閉瀏覽器session就會失效。
    * 若是value是None,session會依賴全局session失效策略。
相關文章
相關標籤/搜索