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/" )
相关文章
相关标签/搜索