cookie 与session

news/2024/6/29 4:50:58 标签: python, 网络, javascript

Django 操作cookie,session

  HTTP协议四大特性:

    1、基于TCP、IP作用与应用层的协议

    2、基于请求响应

    3、无连接

    4、无状态

    无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况

什么是Cookie

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

Cookie的原理

    cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了

查看cookie:

 session 的由来

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

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

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

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

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

设置cookie和装饰器的代码:

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':

old_path
= request.GET.get('next') if old_path: obj = redirect(old_path) else: obj = redirect('/home/') # 用户登录成功 朝浏览器设置一个cookie # obj.set_cookie('name','jason',expires=7*24*3600) obj.set_cookie('name','jason',max_age=5) return obj

return render(request,'login.html') from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args,**kwargs): # 校验cookie # print(request.get_full_path())

old_path = request.get_full_path() if request.COOKIES.get('name'): return func(request,*args,**kwargs) return redirect('/login/?next=%s'%old_path)

return inner @login_auth def index(request): # # print(request.COOKIES.get('name')) # if request.COOKIES.get('name'): return HttpResponse('我是index页面,只有登录了才能看')

 django 获取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:

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
    return rep

 

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 inner


def 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")

 

转载于:https://www.cnblogs.com/HUIWANG/p/11042666.html


http://www.niftyadmin.cn/n/711406.html

相关文章

Xamarin.Forms三

Page主要分为ContentPage、MasterDetailPage、NavigationPage、TabbedPage和CarouselPage。ContentPage 一个单独的页面&#xff0c;可以放一个或多个控件&#xff0c;属于page里面是最底层的元素。 1 /// <summary>2 /// ContentPage3 /// </summary>…

超级计算机看未来天气,广东气候要变?超级计算机:未来10天或滴雨不下,比西北还干燥...

对于我国来说&#xff0c;这段时间南方的很多地方可以说是干燥得吓人&#xff0c;即便是10月下旬有几场喜雨到来&#xff0c;我国江西浙江福建等地的气象干旱也并未能完全解除。而从中国气象局国家气候中心的监测数据上看&#xff0c;过去10天(10月20日-10月29日)我国东部、南部…

CentOS安装JAVA后JAVA版本不对的问题

今天用CentOS安装JDK&#xff0c;发觉在安装完成后&#xff0c;输入java命令来验证是否安装成功时&#xff0c;出现 Usage: gij [OPTION] ... CLASS [ARGS] ... to invoke CLASS.main, or gij -jar [OPTION] ... JARFILE [ARGS] ... to execute a jar …

MyBatis-Plus——逆向工程之AutoGenerator代码生成器

1.案例详解 首先在Navicat中创建一张表。 创建一个SpringBoot项目&#xff0c;在pom文件中添加相关依赖。 大部分依赖我们都是见过的&#xff0c;因为这里需要使用MP框架中的逆向工程生成代码&#xff0c;所以还需要一个模板引擎依赖。 <dependency><groupId>org.s…

黑马程序员—11-oc初认识

------- android培训、java培训、期待与您交流&#xff01; ---------- 一、 OC简介 C语言的基础上&#xff0c;增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码&#xff0c;甚至是C代码 可以使用OC开发Mac OS X平台和iOS平台的应用程序…

创建dynamics CRM client-side (七) - 用JS 来控制Auto-Save

在我们的system setting里面&#xff0c; 我们可以设置打开/关闭 auto save的功能。 我们可以用js来控制auto-save this.formOnSave function (executionContext) {var eventArgs executionContext.getEventArgs();if (eventArgs.getSaveMode() 70 || eventArgs.getSaveMode…

计算机硬件系统方案表,基于EDA技术的计算机硬件系统设计方案

1引言随着计算机技术的迅速发展&#xff0c;计算机系统中使用的硬件部件基本上都采用大规模和超大规模集成电路&#xff0c;这些电路的设计、验证和测试必须使用先进的工具软件&#xff0c;使硬件设计逐渐趋于软件化&#xff0c;加快硬件设计和调试的速度&#xff0c;计算机硬件…

cocos2d JS-(JavaScript) 静态方法的例子

1 function User(name, age) {2 this.name name;3 this.age age;4 }5 var user new User(angela,26);6 7 User.cloneUser function (user) {//静态方法8 return new User(user.name, user.age);//创建…