cookie&session
cookie
1.cookie的由来
大家都知道HTTP协议是无状态的。为什么cookie会和http协议扯上关系那?因为web服务一般都是用http协议用来传输数据。
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。
2.什么是会话技术
在网络上来讲,会话就是客户端和服务器之间进行多次请求与响应,并在一次会话中的多个请求与响应中共享数据(也叫会话跟踪技术)
web中使用cookie和session保持会话。浏览器和服务器值键建立链接,进行数据传输的连接保持不断开。
3.无状态&无连接
无状态: http协议是一种不保存状态的,每次请求都是独立的。http协议自身不对请求和响应做持久化处理 也就是说,在同一浏览器间隔一秒访问同一个网站,对服务器来说是全新的,服务器并不会认识。 协议本身并不保留之前的一切请求和响应的报文信息,这是为了能更快的处理大量的并发,确保协议是可伸缩的。 无连接: 即限制每次链接的请求只有一个,服务端处理完客户的请求,完成数据应答(请求<-->响应)就会断开。 为了节省传输时间,提高并发能力 无连接两种方式: 1.早期http协议在完成一次请求应答之后会主动断开 2.http协议可以根据代码设置保存连接时间
4.cookie详解
2.1 什么是cookie? 首先来讲,cookie是浏览器技术,cookie和session具体指的是一小段信息,他是服务器发送出来存储在浏览器上的一组键值对(字典)。 字典里面存放身份标识符,用来标志用户登录状态。 cookie技术是浏览器出的技术,是会话保持技术,一般在web应用都是使用http协议来展示服务器返回的数据。
2.2 cookie的工作流程
在第一次访问服务器的时候,浏览器会携带一个空的cookie,在登录成功之后,服务器会给浏览器返回一个cookie的文件,大小不超过4kb,并且cookie中的键值对不超过20个。
用户在下次通过浏览器去访问服务器的时候,会在浏览器中带着当前服务器发送过来的cookie里面的键值对去验证,如果服务器给返回cookie的键值对里面键值is_login(自己设置)=true的话,就会自动登录。
一个浏览器对应一个服务器,只有一组cookie,当多个用户访问同一个网站的时候,所有用户的cookie都放在同一组cookie里面
2.3 cookie与header请求头
1.cookie是通过请求头与响应头在客户端和服务器端进行传递的
2.格式
Cookie: 请求头,a=A; b=B; c=C。即多个Cookie用分号离开
Set-Cookie:响应头,服务器端发送给客户端;
3.一个cookie对象,对应一个set-cookie
2.4 cookie特性
1.服务器给浏览器发送必要的登录信息,用来保存登录状态。浏览器可以不保存和设置。
2.cookie是保存在本地浏览器的
3.下次访问的时候携带不过期的cookie。
2.5 为什么使用cookie和session来保持会话?
因为web应用通常使用http来进行数据传输。但是http协议是无连接无状态的。

5.django操作cookie
django操作cookie: 1.设置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,过期时间 path='/': cookie生效的路径,/表示根路径, 注意:根路径的cookie可以被任何url访问 domian=None,cookie生效的域名 secure=False,使用https传输,默认为false httponly=False,只能使用http协议传世,无法被JavaScript获取(不是绝对的,底层抓包也可以获取) 2.获取cookie request.COOKIES['key'] request.get_singned_cookie(key,default=RAISE_ERROR,salt=''max_age=None) 参数: key:键,value:值,default:默认值,salt:加密盐,max_age:过期时间。 3.删除cookie 利用删除cookie的方式做注销功能 def logout(request): rep = redirect('/login/') reo.del_cookie('is_login') #删除返回给浏览器的cookie的值 return rep
6.基于cookie的登录与注销

from django.shortcuts import render,HttpResponse,redirect # Create your views here. def login_auth(func): def inner(request,*args,**kwargs): is_login = request.COOKIES.get('is_login') if is_login !='1': return redirect('/login/?returnurl={}'.format(request.path_info)) else: ret =func(request,*args,**kwargs) return ret return inner def login(request): method = request.method if method == 'POST': user = request.POST.get('username') passwd = request.POST.get('password') if user == 'admin' and passwd == '123': # 校验成功,设置登录状态,返回cookie returnurl = request.GET.get('returnurl') if returnurl: ret = redirect(returnurl) else: ret = redirect('/index/') # 设置cookie ret.set_cookie('is_login','1') return ret return render(request,'login.html',{'error':'用户名密码错误'}) return render(request,'login.html') @login_auth def home(request): # 读取cookie, # is_login = request.COOKIES.get('is_login') # # 判断状态,是否登陆 # if is_login != '1': # return redirect('/login/') return HttpResponse('home ok') @login_auth def index(request): # 读取cookie, # is_login = request.COOKIES.get('is_login') # # 判断状态,是否登陆 # if is_login != '1': # return redirect('/login/') return render(request,'index.html') def logout(request): ret = redirect('/login/') ret.delete_cookie('is_login') return ret
7. 总结
django修改cookie的基础设置 from django.conf import global_settings SESSION_COOKIE_NAME = 'session' cookie的总结: 1.cookie的大小不超过4kb 2.一个浏览器保存cookie的个数是300个,因为一个浏览可以访问多个服务器 3.一个服务器最多在客户端上保存20个cookie。一个用户对应一个浏览器对应一个客户端,也就是对应一个cookie 4.cookie是放在浏览器上面的,所以有不安全的情况
session
1.什么是session
session:也保存在服务器上的一组组键值对(必须依赖cookie),每次请求都带有用户表示的sessionid
注意:session是必须依赖cookie的
什么是session:
session是服务端技术,利用这个技术,服务器运行时可以为每个用户浏览器创建一个其独享的session对象。
由于session为用户浏览器独享,所以用户在访问服务器web资源的时候,可以把各自的数据放在各自的session中,
当用户再去访问服务器中的其他web资源时,起亚web资源再从各自的session中取出数据为用户服务。
2.为什么使用cookie(有session的情况下)
Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。
基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。
我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。
另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。


3.django中session的使用
注意:
在django中session是默认保存在数据库中,也设置保存在文件中和内存中~
1.设置session request.session['is_login'] request.session.get('k1',None) request.session这句话是帮你从cookie里面将sessionid的值取出来,将django-session会比cookie更加安全,因为session是保存在服务器上面。 表里面的对应的sessionid的值对应的那条记录中的session-data数据拿出来解密,get方法就取出k1这个键对应的值。 2.设置值 request.session['k1']=123 request.session.default('k1',123) 存在则不设置 # 帮我们生成随机字符串,帮我们将这个随机字符串和用户数据(加密后)和过期时间保存在django-session表里面,帮我们将这个随机字符串以 # sessionid的形式添加到cookie里面,返回给浏览器,这个sessionid的名字是可以改的。 # from django.conf import global_settings # SESSION_COOKIE_NAME = 'session' 3.修改值 del request.session['k1'] # 删除sessionid的随机值 # django-session表里面同步删除 4.获取所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() 5.会话session的key session_key = request.session.session_key 获取sessionid的值 6.将所有Session失效日期小于当前日期的数据删除,将过期的删除 request.session.clear_expired() 7.检查会话session的key在数据库中是否存在 request.session.exists("session_key") #session_key就是那个sessionid的值 8.删除当前会话的所有Session数据 request.session.delete() 9.删除当前的会话数据并删除会话的Cookie。 request.session.flush() #常用,清空所有cookie---删除session表里的这个会话的记录,这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 10.设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
4.基于session的登录与注销

from django.shortcuts import render,HttpResponse,redirect # Create your views here. def login_auth(func): def inner(request,*args,**kwargs): is_login = request.session.get('is_login') print(request.session) if is_login !='1': return redirect('/login/?returnurl={}'.format(request.path_info)) else: ret =func(request,*args,**kwargs) return ret return inner def login(request): method = request.method if method == 'POST': user = request.POST.get('username') passwd = request.POST.get('password') if user == 'admin' and passwd == '123': # 校验成功,设置登录状态,返回cookie returnurl = request.GET.get('returnurl') if returnurl: ret = redirect(returnurl) else: ret = redirect('/index/') # 设置session request.session['is_login'] = '1' request.session['user'] = 'admin' return ret return render(request,'login.html',{'error':'用户名密码错误'}) return render(request,'login.html') @login_auth def home(request): return HttpResponse('home ok') @login_auth def index(request): return render(request,'index.html') def logout(request): ret = redirect('/login/') request.session.delete() # 删除session,但是不删除django-session表的数据 # request.session.flush() # 删除该cookie里面的sessionid的随机字符串 # 并且删除django_session表里面的记录 return ret
cookie与session的区别
cookie和session的区别? 1.首先都是cookie和session都是会话技术。 2.什么是会话技术?。。。。上面有 3.cookie是一种浏览器会话技术,session是服务器会话及时 4.cookie保存在浏览器本地,有大小和个数的限制,session保存在服务器上面,没有大小和个数的限制 5.从安全性来说,session会比cookie更加安全,因为session是保存在服务器上面。
cookie与session总结
session和cookie的总结 1.session是在cookie的基础上的安全认证,是放在服务端上的,主要通过session来保持会话 2.session存放在django-session的表里面 3.设置request.session['is_login'] = 1 是做聊什么事情那? 3.1 生成一个随机的字符串sessionid,sessionid:xxxxx 3.2 加密一些用户信息aaaaa,以sessionid为条件查找用户加密的信息 sessionid:xxxxx userinfo:aaaaa 3.3 将sessiodid:userinfo 放到cookie返回给客户端 4.is_login = request.session.get('is_login')获取session的时候做了什么事情? 4.1 从cookie中找到sessionid的值xxxxx, 4.2 通过xxxx知道django-session表中的记录,将session-data取出,并解密,{'is_login':'1','userinfo':admin} 返回给视图函数做验证 5.session.flush做了什么事情? 5.1 将cookie里面的sessionid删除掉 5.2 将django-session表里面的sessionid对应的数据删除掉
cookie&session的一些配置
from django.conf import global_settings SESSION_COOKIE_NAME = 'sessionid' 设置cookie名字 SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 超时时间,秒 SESSION_SAVE_EVERY_REQUEST = True 每次访问都保存session数据 SESSION_EXPIRE_AT_BROWSER_CLOSE = True 关闭浏览器就失效 SESSION_ENGINE = 'django.contrib.sessions.backends.db' 引擎,session数据保存在哪里 默认保存在数据库里面、。,如果要是使用必须python manage.py makemigrations 如何查看session支持的引擎,在settings里面设置 from django.contrib.sessions.backends import db,然后点进去 可以看到session可以保存到:缓存,缓存加数据库,文件,数据库,加密cookie。 SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer' 保存的时候可以进行json序列化 session-key是根据浏览器来进行表示一个用户的。session-data先json序列化之后,在进行加密,存放到session数据库里面。
pass
上帝说要有光,于是便有了光;上帝说要有女人,于是便有了女人!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类