博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cookie和Session
阅读量:5297 次
发布时间:2019-06-14

本文共 3109 字,大约阅读时间需要 10 分钟。

cookie

Cookie的由来

由于HTTP协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,进而对服务器来说,每次的请求都是全新的,这样就导致客户端和服务器会话中产生的数据不会被保留。但是会话中的数据我们又需要保留,哈哈,Cookie就应运而生了。

什么是cookie

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

Django中操作Cookie

设置Cookie

#必须有响应,才能把cookie传输给浏览器rep = HttpResponse(...)rep = render(request, ...) #两种设置方式rep.set_cookie(key,value,...)rep.set_signed_cookie(key,value,salt='加密盐',...)

 

参数:

  • 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

request.COOKIES['key']#必须要有default默认值request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

 

参数:

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

Cookie版登陆校验

def check_login(func):    @wraps(func)    def inner(request, *args, **kwargs):        next_url = request.get_full_path()        if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":            # 已经登录的用户...            return func(request, *args, **kwargs)        else:            # 没有登录的用户,跳转刚到登录页面            return redirect("/login/?next={}".format(next_url))    return innerdef login(request):    if request.method == "POST":        username = request.POST.get("username")        passwd = request.POST.get("password")        if username == "xxx" and passwd == "dashabi":            next_url = request.GET.get("next")            if next_url and next_url != "/logout/":                response = redirect(next_url)            else:                response = redirect("/class_list/")            response.set_signed_cookie("login", "yes", salt="SSS")            return response    return render(request, "login.html")
cookie版校验登录

Session

cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。

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

另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架。

Django中Session相关方法

def index(request):    # 获取、设置、删除Session中数据    request.session['k1']    request.session.get('k1',None)    request.session['k1'] = 123    request.session.setdefault('k1',123) # 存在则不设置    del request.session['k1']    # 所有 键、值、键值对    request.session.keys()    request.session.values()    request.session.items()    request.session.iterkeys()    request.session.itervalues()    request.session.iteritems()    # 用户session的随机字符串    request.session.session_key     # 将所有Session失效日期小于当前日期的数据删除    request.session.clear_expired()     # 检查 用户session的随机字符串 在数据库中是否    request.session.exists("session_key")     # 删除当前用户的所有Session数据    request.session.delete()     request.session.set_expiry(value)        * 如果value是个整数,session会在些秒数后失效。        * 如果value是个datatime或timedelta,session就会在这个时间后失效。        * 如果value是0,用户关闭浏览器session就会失效。        * 如果value是None,session会依赖全局session失效策略。

 

转载于:https://www.cnblogs.com/zzy-9318/p/8763210.html

你可能感兴趣的文章
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>
MySQL Proxy
查看>>
随机颜色值
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
目录相关的操作
查看>>
C++----练习--引用头文件
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
FUSE-用户空间文件系统
查看>>
 VS2012 C#调用C++ dll
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
图片问题
查看>>
bash使用规则
查看>>
AVL数
查看>>