Cookie和Session

會話跟蹤技術

  • 在一個會話的多個請求中共享數據
  • 會話路徑技術使用Cookie或session完成
  • HTTP協議是無狀態協議,也就是說每一個請求都是獨立的!沒法記錄前一次請求的狀態。但HTTP協議中可使用Cookie來完成會話跟蹤!在Web開發中,使用session來完成會話跟蹤,session底層依賴Cookie技術。

Cookie

Cookie是由服務器建立,經過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,並會標註出Cookie的來源(哪一個服務器的Cookie),當客戶端向服務器發出請求時會把全部這個服務器Cookie包含在請求中發送給服務器,這樣服務器就能夠識別客戶端了!html

  • 不一樣瀏覽器之間是不共享Cookie的
  • 保存在瀏覽器端「鍵值對」
  • 服務端能夠向用戶瀏覽器端寫cookie
  • 客戶端每次方請求時,會攜帶cookie去
  • 具體一個瀏覽器,針對一個服務器的存值

'''
class HttpResponseBase:

        def set_cookie(self, key,                 鍵
                     value='',            值
                     max_age=None,        超長時間 
                              cookie須要延續的時間(以秒爲單位)
                              若是參數是\ None`` ,這個cookie會延續到瀏覽器關閉爲止。

                     expires=None,        超長時間
                                 expires默認None ,cookie失效的實際日期/時間。 
                                

                     path='/',           Cookie生效的路徑,
                                                 瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣能夠避免將
                                                 cookie傳給站點中的其餘的應用。
                                                 / 表示根路徑,特殊的:根路徑的cookie能夠被任何url的頁面訪問
                     
                             domain=None,         Cookie生效的域名
                                                
                                                  你可用這個參數來構造一個跨站cookie。
                                                  如, domain=".example.com"
                                                  所構造的cookie對下面這些站點都是可讀的:
                                                  www.example.com 、 www2.example.com 
                                 和an.other.sub.domain.example.com 。
                                                  若是該參數設置爲 None ,cookie只能由設置它的站點讀取。

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

'''

獲取cookie: request.COOKIES
刪除cookie:response.delete_cookie("cookie_key",path="/",domain=name)
set_cookie源碼

1、django中cookie語法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 設置cookie  rep.set_cookie(key,value,...)
# response = HttpResponse(...) 或 response = render(request, ...) 或 response = redirect()
response = HttpResponse( "登陸成功!" )
response.set_cookie( "is_login" , True )
response.set_cookie( "username" , user.user, path = "/index/" )
 
import datetime
 
now = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S" )
response.set_cookie( "last_visit_time" , now)
 
# 獲取cookie:
is_login = request.COOKIES.get( "is_login" )
username = request.COOKIES.get( "username" )
last_visit_time = request.COOKIES.get( "last_visit_time" , "")
 
# cookie簽名:
# response = HttpResponse(...) 或 response = render(request, ...) 或 response = redirect()
response = HttpResponse( "登陸成功!" )
response.set_signed_cookie( 'ticket' , "123123" , salt = '加密鹽' )
request.get_signed_cookie( 'ticket' ,salt = '加密鹽' )

Session

Session是服務器端技術,利用這個技術,服務器在運行時能夠爲每個用戶的瀏覽器建立一個其獨享的session對象,因爲 session爲用戶瀏覽器獨享,因此用戶在訪問服務器的web資源時 ,能夠把各自的數據放在各自的session中,當用戶再去訪問該服務器中的其它web資源時,其它web資源再從用戶各自的session中 取出數據爲用戶服務。python

  • 保存在服務端的數據(本質是鍵值對)
  • 敏感信息不會直接給客戶端
  • 依賴cookie
  • 當用戶來登陸的時候,服務端生成隨機字符串給客戶端的瀏覽器,瀏覽器寫到cookie裏面, 服務器端把這個隨機字符串保存裏面,讓這個隨機字符串能夠對應一些值,這些值就屬於用戶,每一個用戶就是一個隨機字符串

1、設置Sessions值
          request.session['session_name'] ="admin"
2、獲取Sessions值
          session_name = request.session["session_name"]
3、刪除Sessions值
          del request.session["session_name"]
4、flush()
     刪除當前的會話數據並刪除會話的Cookie。
     這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
五、get(key, default=None)
  
fav_color = request.session.get('fav_color', 'red')
  
6、pop(key)
  
fav_color = request.session.pop('fav_color')
  
7、keys()
  
8、items()
  
9、setdefault()
  
  
10 用戶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失效策略。
session語法

1、django中session語法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
'''
#設置session
if request.COOKIE.get("sessionid"):
     更新
      在django—session表中建立一條記錄:
        session-key                                     session-data
        ltv8zy1kh5lxj1if1fcs2pqwodumr45t                  更新數據
else:
     1 生成隨機字符串   ltv8zy1kh5lxj1if1fcs2pqwodumr45t
     2 經過cookie發送給客戶端  response.set_cookie("sessionid",ltv8zy1kh5lxj1if1fcs2pqwodumr45t)
     3 服務端保存 在django—session表中建立一條記錄:
        session-key                                     session-data
        ltv8zy1kh5lxj1if1fcs2pqwodumr45t       {"is_login":True,"username":"yuan"}
        
     {
       隨機字符串1: {'username':'bubu','email':x''...}
     }
'''
request.session[ "is_login" ] = True
request.session[ "username" ] = user.user
 
request.session.setdefault( 'k1' , 123 ) # 存在則不設置
 
import datetime
 
now = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S" )
request.session[ "last_visit_time" ] = now
 
'''
#獲取session:
1  獲取客戶端cookie中的隨機字符串 request.COOKIE.get("sessionid")  #  ltv8zy1kh5lxj1if1fcs2pqwodumr45t
2  去session中查找有沒有隨機字符  django-session表中查找記錄:
            session-key                                   session-data
            ltv8zy1kh5lxj1if1fcs2pqwodumr45t       {"is_login":True,"username":"yuan"}
    obj=django—session.objects .filter(session-key=ltv8zy1kh5lxj1if1fcs2pqwodumr45t).first()
3 去session對應key的value中查看是否有 is_login   obj.session-data.get("is_login")
'''
is_login = request.session.get( "is_login" , None )
username = request.session.get( "username" , None )
last_visit_time = request.session.get( "last_visit_time" , None )
 
#其餘
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
 
# 用戶session的隨機字符串
session_key = request.session.session_key
 
'''
#刪除session
1 randon_str=request.COOKIE.get("sessionid")
2 django-session.objects.filter(session-key=randon_str).delete()
3 response.delete_cookie("sessionid",randon_str)
'''
request.session.flush() #所有刪除(完成上面3步)   推薦使用
del request.session[ 'k1' ] #刪除的是隨機字符串裏面的k1

2、Django的session配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
"""
# settings.py中配置
Django默認支持Session,而且默認是將Session數據存儲在數據庫中,即:django_session表中。提供了5種類型的Session
"""
#1.數據庫
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默認)
#2.緩存
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'
# 要配合Django緩存配置
# 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置
#3.文件
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_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 = True  # (每次刷新更新時間) 是否每次請求都保存Session,默認修改以後才保存(默認)

練習

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from django.shortcuts import render, HttpResponse, redirect
from app01.models import UserInfo
def login(request):
     if request.method = = "POST" :
         user = request.POST.get( "user" )
         pwd = request.POST.get( "pwd" )
 
         user = UserInfo.objects. filter (user = user, pwd = pwd).first()
         if user:
             #===================設置cookie===================
             response = HttpResponse( "登陸成功!" )
             response.set_cookie( "is_login" , True )
             response.set_cookie( "username" , user.user, path = "/index/" )
             import datetime
             last_visit_time = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S" )
             response.set_cookie( "last_visit_time" ,last_visit_time)
 
             # cookie簽名:
             # response.set_signed_cookie('ticket', "123123", salt='加密鹽')
             # request.get_signed_cookie('ticket',salt='加密鹽')
 
             #過時時間
             # response.set_cookie("is_login",True,max_age=15)
             # date=datetime.datetime(year=2019,month=5,day=29,hour=14,minute=34)
             # response.set_cookie("username",user.user,expires=date)
             return response
             #===================end 設置cookie===================
 
             # ===================設置session===================
             import datetime
             last_visit_time = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S" )
             # request.session["is_login"] = True
             # request.session["username"] = user.user
             # request.session["last_visit_time"] = last_visit_time
 
             request.session[ 'user_info' ] = { 'is_login' : True , 'username' : user.user,
                                             'last_visit_time' : last_visit_time}
             return HttpResponse( "登陸成功!" )
             # ===================end 設置session===================
 
     return render(request, "login.html" )
 
def index(request):
     # ===================獲取cookie===================
     is_login = request.COOKIES.get( "is_login" )
     if is_login:
         username = request.COOKIES.get( "username" )
         last_visit_time = request.COOKIES.get( "last_visit_time" , "")
         return render(request, "index.html" , { "username" : username, "last_visit_time" : last_visit_time})
     # ===================end 獲取cookie===================
 
     # ===================獲取session===================
     is_login = request.session.get( "user_info" ).get( "is_login" , None )
     if is_login:
         username = request.session.get( "user_info" ).get( "username" )
         last_visit_time = request.session.get( "user_info" ).get( "last_visit_time" )
         return render(request, "index.html" , { "username" : username, "last_visit_time" : last_visit_time})
     # ===================end 獲取session===================
     else :
         return redirect( "/login/" )
 
def logout(request):
     request.session.flush()
     return redirect( "/login/" )
相關文章
相關標籤/搜索