zoukankan      html  css  js  c++  java
  • Cookie与Session

    什么是cookie

    1、由于BS架构基于HTTP协议,是无状态的,不能保存客户端状态

    2、使用cookie/session技术可以保存客户端用户状态

    3、cookie是服务端生成发送给客户端的键值对,浏览器会保存它

    4、浏览器可以设置禁止cookie的写入,即不保存cookie

    cookie原理

    cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;

    当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了


    Django中操作cookie

    视图函数都是返回一个对象,只需要给这个对象进行操作就可以了

    # 一般有三种方式返回数据
    obj = HttpResponse()
    # 中间写设置等操作。。
    return obj
    
    obj = render()
    return obj
    
    obj = redirect()
    return obj
    

    服务端获取cookie

    request.COOKIES['key']
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    

    参数:

    • default: 默认值
    • salt: 加密盐
    • max_age: 后台控制过期时间

    设置cookie

    rep = HttpResponse(...)
    rep = render(request, ...)
    
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
    

    参数:

    • key, 键
    • value='', 值
    • max_age=None, 超时时间
    • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
    • path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    • domain=None, Cookie生效的域名
    • secure=False, https传输
    • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    删除cookie

    obj.delete_cookie('k1')
    
    '''
    删除cookie意味着注销客户端用户
    定义注销视图函数即可'''
    def logout(request):
        obj = redirect('/login/')
        obj.delete_cookie('user')
    

    什么是session

    Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息

    我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

    总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本

    Django中操作session

    创建cookie_session表

    1、在django项目第一次创建表,迁移同步到数据库中时,会默认创建多个表,其中包括diango_sessioon表

    2、在django_session表创建完成的情况下,才能操作session

    设置session

    def set_session(request):
        request.session['name'] = 'kai'
        return HttpResponse("set_session")
    '''
    1、使用的name:kai键值对,是生成cookie的相同的键值对
    2、django内部自动调用算法生成一个随机的字符串
    3、django_session表中添加数据
        以2中生成的字符串为主键session_key
        给数据加密生成字符串,添加进session表中session_data
        同时,自动生成session有效期限,mysql默认为14天 
    '''
    

    获取session

    def get_session(request):
        print(request.session.get('name'))
        return HttpResponse("get_session")
    '''
    1、Django内部自动去请求头里面获取cookie
    2、拿着session所对应的随机字符串去django_session表中比对session_key
    3、如果比对上了,获取对应的session_data,放入request.session中,以供程序员调用
    4、如果没有比对上,那么request.session就是一个空字典
    '''
    

    删除session

    def del_session(request):
        request.session.flush()
        return HttpResponse('注销了')
    '''
    1、一个客户端对应django_session表中的一条数据
    2、删除session,就是将该客户端对应的所有cookie删除
    '''
    

    设置失效时间

    request.session.set_expiry(value)
    '''
    1、value是个整数,时间单位是秒
    2、value是个datatime或者timedelta,那就是最后的有效期
    3、value是0,用户关闭浏览器就会 失效
    4、value是None,session会依赖全局session失效策略
    '''
    

    Session版本登陆验证

    from functools import wraps
    def login_auth(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            target_url = request.path_info
            if request.COOKIES.get('username'):
                res = func(request, *args, **kwargs)
                return res
            else:
                return redirect(f'/login/?next={target_url}')
        return inner
    
    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'kai' and password == '123':
                target_url = request.GET.get('next')
                # 判断用户登陆之前是否有想要访问的url
                if target_url:
                    # 如果有,就跳转回登陆之前的URL
                    obj = redirect(target_url)
                # 否则默认跳转到home页面
                else:
                    obj = redirect('/home/')
                # 设置cookie
                obj.set_cookie('username', 'kai')
                return obj
        return render(request, 'login.html')
    
    @login_auth
    def logout(request):
        obj = HttpResponse('注销了')
        obj.delete_cookie('username')
        return obj
    
  • 相关阅读:
    MIX11大会WP7主题演讲中文字幕版
    日本战神——源义经
    System.Web.HttpUtility for .Net Compact Framework
    VS2010 SP1
    <如何成为一个成功的职业经理人>读书笔记2
    <左手曾国藩,右手胡雪岩>读书笔记
    <福布斯荐75本经商必读06基业长青>读书笔记
    <中国人聪明之道>读书笔记
    <浮沉>读书笔记
    <79个潜规则:改变生活的心理学法则>读书笔记
  • 原文地址:https://www.cnblogs.com/kai-/p/12189867.html
Copyright © 2011-2022 走看看