Cookie与Session

Posted kai-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Cookie与Session的主要内容,如果未能解决你的问题,请参考以下文章

cookie 与 session

JavaWeb学习笔记(狂神版)--- 第九节 Cookie与Session

cookie与session

少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

php 练习题-session与 cookie的 取值赋值

解析session与cookie