cookie与session

cookie与session

发展史 

        1. 网站都没有保存用户功能的需求 所有用户访问的结果都是一样的

                eg: 新闻,博客,文章等

        2. 出现了一些需要保存用户信息的网站

                eg:淘宝,支付宝,京东等

                以登录功能为例:如果不保存用户登录状态 也就意味着用户每次访问网站都需要重复的输入用户名和密码(你觉得这样的网站你还想用吗?)

                当用户第一个登录成功之后 将用户的用户名密码返回给用户浏览器 让用户浏览器保存在本地,之后访问网站的时候浏览器自动将保存在浏览器上的用户名和密码发送给服务端,服务端获取之后自动验证

                早期这种方式具有非常大的安全隐患

                优化:

                        当用户登录成功之后,服务端产生一个随机字符串(在服务端保存数据,用k,v键值对的形式),交由客户端浏览器保存

                随机字符串1:用户1相关信息

                随机字符串2: 用户2相关信息

                        之后访问服务端的时候,都带着该随机字符串,服务端去数据库中比对是否有对应的随机字符串从而获取到对应的用户信息

但是如果你截获到了该随机字符串,那么你就可以冒充当前用户,其实还是有安全隐患的

你要知道在web领域没有绝对的安全也没有绝对的不安全

cookie

        服务端保存在客户端浏览器上的信息都可以称之为cookie

        它的表现形式一般都是k:v键值对(可以有多个)

session

        数据是保存在服务端的并且它的表现形式一般也是k:v键值对(可以有多个)

token

        session虽然数据是保存在服务端的        但是禁不住数据量大

        服务端不再保存数据

                登录成功之后 将一段信息进行加密处理(加密算法只有开发人员知道)

                将加密之后的结果拼接在信息后面 整体返回给浏览器保存

                浏览器下次访问的时候带着该信息        服务器自动切取前面一段信息再次使用自己的加密算法

                跟浏览器尾部的密文进行匹配

jwt认证

        三段信息

总结:

        1. cookie就是保存在客户端浏览器上的信息

        2. session就是保存在服务端上的信息

        3. session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用到cookie)

cookie操作 

虽然cookie是服务端告诉客户端浏览器需要保存内容

但是客户端浏览器可以拒绝保存 如果禁止了 那么只要是需要记录用户状态的网站登录功能都无法使用了

视图函数的返回值

return HttpResponse()
return render()
return redirect()

obj1 = HttpResponse()
# 操作cookie
return obj1
obj2 = render()
return obj2
obj3 = redirect()
return obj3

如果你想要操作cookie,你就不得不利用obj对象

设置cookie

obj.set_cookie(key,value)

获取cookie

request.COOKIES.get(key)

 在设置cookie的时候可以添加一个超时时间

        max_age

        expires

                两者都是设置超时时间的 并且都是以秒为单位

                需要注意的是 针对IE浏览器需要使用expires

obj.set_cookie('username', 'jason666',max_age=3,expires=3)

主动删除cookie (注销功能)

# 校验用户是否登录的装饰器
def login_auth(func):
    def inner(request,*args, **kwargs):
        # print(request.path_info)
        # print(request.get_full_path_info()) # 能够获取到用户上一次想要访问的url
        target_url = request.get_full_path_info()
        if request.COOKIES.get('username') == 'jason666':
            res = func(request,*args, **kwargs)
            return res
        else:
            return redirect('/login/?next=%s'%target_url)
    return inner


# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # print(username,password)
        if username == 'jason' and password == '123':
            # 获取用户上一次访问的url
            # print(request.GET)
            target_url = request.GET.get('next') # 这个结果可能是None
            if target_url:
                obj= redirect(target_url)
            else:
                obj = redirect('/home/')

            # print(target_url)
            # 保存用户登录状态
            # obj = redirect('/home/')
            # print(obj)
            # 让浏览器记录cookie数据
            obj.set_cookie('username', 'jason666')
            """
            浏览器不单单会帮你存
            而且后面每次访问你的时候还会带着它过来
            """
            # 跳转到一个需要用户登录之后才能看的页面
            return obj
    return render(request, 'login.html')

"""
用户如果在没有登录的情况下想访问一个需要登录的页面
那么先跳转到登录页面 当用户输入正确的用户名和密码之后
应该跳转到用户之前想要访问的页面去 而不是直接写死
"""
@login_auth
def home(request):
    # 获取cookie信息 判断你有没有
    # if request.COOKIES.get('username') == 'jason666':
    #     return HttpResponse('我是home页面,只有登录的用户才能进来哦')
    # # 没有登录应该跳转到登录页面
    # return redirect('/login/')
    return HttpResponse('我是home页面,只有登录的用户才能进来哦')

session操作

session数据是保存在服务端的(存?),给客户端返回的是一个随机字符串

        sessionid: 随机字符串 

1. 在默认情况下操作session的时候需要django默认的一张django_session表

        数据库迁移命令

                django会自己创建很多表        django_session就是其中的一张

django默认session的过期时间是14天

        但是你也可以人为的修改

设置session

request.session['key'] = value

获取session

request.session.get['key']

设置过期时间

request.session.set_expiry()
"""
括号内可以放四种类型的参数
1. 整数 多少秒
2. 日期对象    到指定日期就失效
3. 0    一旦当前浏览器窗口关闭立刻失效
4. 不写    失效时间取决于django内部全局session默认的失效时间
"""

清除session

request.session.delete() # 只删服务端的 客户端的不删
request.session.flush() # 浏览器和服务端都清空 一般情况下用这个

session是保存在服务端的        但是session的保存位置可以有多种选择

        1. MySQL

        2. 文件

        3. redis

        4. memcache

        ...

django_session表中的数据条数是取决于浏览器的

        同一个计算机上(IP地址)同一个浏览器只会同时有一条数据生效 (当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除,也可以通过代码清除)

        主要是为了节省服务端数据库资源

def set_session(request):
    request.session['hobby'] = 'girl'
    """
    内部发生了哪些事
        1. django内部会自动帮你生成一个随机字符串
        2. django内部自动将随机字符串和对应的数据存储在django_session表中(这一步不是直接生效的)
            2.1 先在内存中产生操作数据的缓存
            2.2 在响应经过django中间件的时候才真正的操作数据库
        3. 将产生的随机字符串返回给客户端浏览器保存
    """
    return HttpResponse('嘿嘿嘿')

def get_session(request):
    print(request.session.get('hobby'))
    """
    内部发生了哪些事
        1. 自动从浏览器请求中获取session id对应的随机字符串
        2. 拿着该随机字符串去django_session表中查找对应的数据
        3. 如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中
            如果比对不上 则request.session.get()返回的是None
    """
    return HttpResponse('哈哈哈')

CBV如何增加装饰器 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值