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
View Code
复制代码

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
View Code
复制代码

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

posted @   thep0st  阅读(49)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .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技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示