热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cookie与session(全面了解)

目录一:cookie与session1.什么是Cookie?2.Cookie主要用于以下三个方面3.什么是Session?4.Cookie与Session有什么不同?5.为什么需要

目录



  • 一:COOKIE与session



      • 1.什么是COOKIE?

      • 2.COOKIE主要用于以下三个方面

      • 3.什么是Session?

      • 4.COOKIE与Session有什么不同?

      • 5.为什么需要COOKIE和Session,他们有什么关联?

      • 6.那么 COOKIE 和 Session 是如何配合的呢?

      • 7.应用场景(以登陆功能为例)

      • 7.1不完善(影响用户体验)

      • 7.2完善(提示用户体验)

      • 8.简述工作原理

      • 9.token

      • 10.jwt认证





  • 二:COOKIE操作

  • 三:操作COOKIE格式

  • 四:使用COOKIE方法

  • 五:解析COOKIE设置超时时间两者方法区别:

  • 六:COOKIE项目需求



      • 1.目前缺点 装饰器

      • 2.解决方法

      • 3.实现COOKIE项目

      • 4.设置超时时间

      • 5.注销功能

      • 6.注销作用:





  • 七:session操作



      • 1.在默认情况下操作session的时候需要django默认的一张django_session表

      • 2.列如数据库迁移:

      • 3.django默认session过期时间

      • 4.session操作格式





  • 八:实际操作设置与获取session



      • 1.设置session

      • 2.获取session

      • 3.设置session内部工作原理

      • 4.获取session内部工作原理

      • 5.django_session表中的数据条数是取决于浏览器的

      • 6.设置过期时间

      • 7.设置过去时间实际使用

      • 8.清除session

      • 9.使用清除session

      • 10.session是保存在服务端的 但是session的保存位置可以有多种选择






一:COOKIE与session


1.什么是COOKIE?

HTTP COOKIE(也叫Web COOKIE或浏览器COOKIE)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一个服务器再发起请求时被携带并发送到服务器上,通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登陆状态。COOKIE使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

Django中的COOKIE和session


2.COOKIE主要用于以下三个方面


  • 会话状态管理(如用户登陆状态,购物车,游戏分数或其他需要记录的信息)

  • 个性化设置(如用户自定义设置,主题等)

  • 浏览器行为跟踪(如跟踪分析用户行为等)


3.什么是Session?

Session代表着服务器和客户端一次会话的过程。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者超时Session超时失效时会话结束。

image


4.COOKIE与Session有什么不同?


  • 作用范围不同,COOKIE保存在客户端(浏览器),Session保存在服务器端。



  • 存取方式的不同,COOKIE只能保存ASCII,Session可以存任意数据类型,一般情况下我们可以在Session中保持一些常用变量信息,比如说Userid等。



  • 有效期不同,COOKIE可设置为长时间保持,比如我们经常使用的默认登陆功能,Session一般失效时间较短,客户端关闭或者Session超时都会失效



  • 隐私策略不同,COOKIE 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 COOKIE 中导致信息被窃取;Session 存储在服务端,安全性相对 COOKIE 要好一些。



  • 存储大小不同, 单个 COOKIE 保存的数据不能超过 4K,Session 可存储数据远高于 COOKIE。



  • session是基于COOKIE工作的(其实大部分的保存用户状态的操作都需要使用到COOKIE)




5.为什么需要COOKIE和Session,他们有什么关联?

1.说起来为什么需要 COOKIE ,这就需要从浏览器开始说起,我们都知道浏览器是没有状态的(HTTP 协议无状态),这意味着浏览器并不知道是张三还是李四在和服务端打交道。这个时候就需要有一个机制来告诉服务端,本次操作用户是否登录,是哪个用户在执行的操作,那这套机制的实现就需要 COOKIE 和 Session 的配合。

看完这篇Session、COOKIE、Token,和面试官扯皮就没问题了- 程序员cxuan - 博客园


1.用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session ,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 COOKIE 中,同时 COOKIE 记录此 SessionID 属于哪个域名。
2.当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 COOKIE 信息,如果存在自动将 COOKIE 信息也发送给服务端,服务端会从 COOKIE 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
3.根据以上流程可知,SessionID 是连接 COOKIE 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

7.应用场景(以登陆功能为例)

7.1不完善(影响用户体验)

1.以登录功能为例:如果不保存用户登陆状态,也就意味着用户每次访问网站都需要重复的输入用户名和密码(你觉得这样的网站你还想要吗?)

7.2完善(提示用户体验)

2.当用户第一次登陆成功之后,将用户的用户名和密码返回给用户浏览器,让用户浏览器保存在本地,之后访问网站的时候浏览器自动将保存在浏览器上的用户名和密码发送给服务端,服务端获取之后自动验证

8.简述工作原理

1.当用户登陆成功之后,服务端产生一个随机字符串(在服务端保存数据,用k:v键值对的形式),交由客户端浏览器保存。
2.之后客户端在访问服务端的时候,都带着该随机字符串,服务端去数据库中比对是否有对应的随机字符串从而获取到对应的用户信息
隐患:
如果你拿到了截获到了该随机字符串,那么你就可以冒充当前用户 其实还是有安全隐患的
解决隐患:
你要知道在web领域没有绝对的安全也没有绝对的不安全,只能不断的优化,加强。

9.token

session虽然数据是保存在服务端的 但是禁不住数据量大
服务端不再保存数据
1.登陆成功之后 将一段用户的数据进行加密(加密算法之后你公司开发知道)
2.将加密之后的结果拼接在信息后面 整体返回浏览器保存
3.浏览器下次访问的时候带着该信息 服务端自动切去前面一段信息再次使用自己的加密算法跟浏览器尾部的密文进行比对

10.jwt认证


  • 三段信息 后期更新


二:COOKIE操作

1.虽然COOKIE是服务端告诉客户端浏览器需要保存内容
2.但是客户端浏览器可以选择拒绝保存,如果禁止了,那么只要需要记录用户状态的网站登陆功能都无法使用了!

image

# 视图函数的返回值
return HttpResponse()
return render()
return redirect()

三:操作COOKIE格式

1.如果你想要操作COOKIE,你就不得不利用obj对象
2.在中间利用对象操作COOKIE
obj1 = HttpResponse()
# 操作COOKIE
return obj1
obj2 = render()
# 操作COOKIE
return obj2
obj3 = redirect()
# 操作COOKIE
return obj3

四:使用COOKIE方法

设置COOKIE
obj.set_COOKIE(key,value) # k:v键值对形式
获取COOKIE
request.COOKIES.get(key) # 当作字典看 通过键拿值

在设置COOKIE的时候可以添加一个超时时间
obj.set_COOKIE('username', 'jason666',max_age=3,expires=3)
注销功能 主动删除COOKIE
obj.delete_COOKIE('username/键')

五:解析COOKIE设置超时时间两者方法区别:

max_age
expires
1.两者都是设置超时时间的 并且都是以秒为单位
2.需要注意的是 针对IE浏览器需要使用expires

六:COOKIE项目需求

1.我们完成一个真正的登陆功能
2.校验用户是否登陆的装饰器

1.目前缺点 装饰器

1.用户如果在没有登陆的情况下想访问一个需要登陆的页面
2.那么先跳到登陆页面 用户输入正确的用户名和密码之后
3.应该跳转到用户之前想要访问的页面去 而不是直接写死

2.解决方法

1.在装饰器login_auth内设置一个获取用户上一次想访问的url
2.将用户想访问的url放在当作参数get请求重定向发送给login
3.login获取用户想访问的url,然后判断生成对象,重定向返回!

3.实现COOKIE项目

from django.shortcuts import render, HttpResponse,redirect
# 校验用户是否登陆的装饰器
def login_auth(func):
def inner(request, *args, **kwargs):
# print(request.path_info)
# print(request.get_full_path()) # 两种方法能够获取到用户上一次想要访问的url
# 获取用户上一次想访问的url
target_url = request.get_full_path()
# 获取COOKIE
if request.COOKIES.get('username'):
return func(request, *args, **kwargs)
else:
# 在用户没有登陆的情况 携带用户想访问的url参数
return redirect('/login/?next=%s' % target_url)
return inner
# 登陆功能
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
# 获取用户上一次想要访问的url
target_url = request.GET.get('next') # 这个结果可能是None
if target_url:
# 保存用户登陆状态
obj = redirect(target_url)
else:
# 保存用户登陆状态
obj = redirect('/home/')
# 2.让浏览器记录COOKIE数据 设置COOKIE
obj.set_COOKIE('username','jason666') # 告诉浏览器存一个k:v键值对
"""
1.浏览器不单单会帮你存
2.而且后面每次访问你的时候还会带着它过来
"""
# 跳转到一个需要用户登陆之后才能看的页面
return obj
return render(request, 'login.html')
@login_auth
def home(request):
# # 1.获取COOKIE信息 判断有没有登陆
# if request.COOKIES.get('username') == 'jason666':
# return HttpResponse('home主页,登陆成功之后才能进入')
# # 2.没有登陆应该跳转到登陆页面
# return redirect('/login/')
# 装饰器代表以上nobility方式
return HttpResponse('home主页,登陆成功之后才能进入')
@login_auth
def index(request):
return HttpResponse('index页面,登陆成功之后才能进入')
@login_auth
def func(request):
return HttpResponse('func页面,登陆成功之后才能进入')

image


4.设置超时时间

# 2.让浏览器记录COOKIE数据
obj.set_COOKIE('username','jason666', max_age=5) # 告诉浏览器存一个k:v键值对
max_age=5 : 设置超时时间 到时候自动清除COOKIE

image


5.注销功能

# 只有登陆的用户才能注销
@login_auth
def logout(request):
# 返回主页
obj = redirect('/login/')
# 删除指定的键值对
obj.delete_COOKIE('username')
return obj

6.注销作用:

注销之后,就已经清除COOKIE,就不能再访问home了

image


七:session操作

session数据是保存在服务端的(存?),给客户端返回的是一个随机字符串
sessionid : 随机字符串

1.在默认情况下操作session的时候需要django默认的一张django_session表

2.列如数据库迁移:

当我们执行数据库迁移命令
django会自己创建很多表 django_session就是其中的一张

image


3.django默认session过期时间

django默认的session的过期时间是14天
但是你也可以人为的修改它

4.session操作格式

设置session
request.session['key'] = value
获取session
request.session.get('key')

八:实际操作设置与获取session


1.设置session

def set_session(request):
request.session['hobby'] = 'girl'
return HttpResponse('嘿嘿嘿')

image


2.获取session

def get_session(request):
print(request.session.get('hobby'))
return HttpResponse('获取了')

image


3.设置session内部工作原理

1.django内部会自动帮你生成一个随机字符串
2.django内部自动将随机字符串和对应的数据存储到django_session表中
中间件第二个执行:
2.1 先在内存中产生操作数据的缓存
2.2 在响应经过django中间件的时候才真正的操作数据库
3.将产生的随机字符串返回给客户端浏览器保存

4.获取session内部工作原理

1.自动从浏览器请求中获取session对应的随机字符串
2.拿着该随机字符串去django_session表中查找对应的数据
3.如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中
4.如果比对不上 则request.session.get()返回是None

5.django_session表中的数据条数是取决于浏览器的

1.django_session表中的数据条数是取决于浏览器的
2.同一个计算机上(IP地址)同一个浏览器只会有一条数据生效,不同的浏览器才会产生每条数据
3.(当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过代码清除)
原因:
主要是为了节省服务端数据库资源,不然同一个浏览器一直访问,每次访问会产生一条数据的话,会极大的影响数据库资源与内存消耗。

image


6.设置过期时间

request.session.set_expiry()
括号内可以放四种类型的参数:
1.整数 多少秒
2.日期对象 到指定日期就失效
3.0 一旦当前浏览器窗口关闭立刻失效
4.不写 失效时间就取决于django内部全局session默认的失效时间

7.设置过去时间实际使用

设置session
def set_session(request):
# 设置session
request.session['hobby'] = 'girl'
# 设置过期时间
request.session.set_expiry(3)
return HttpResponse('设置了')
# 获取session
def get_session(request):
# 判断session
if request.session.get('hobby'):
print(request.session)
print(request.session.get('hobby'))
return HttpResponse('获取了')
return HttpResponse('失效,未获取')

image


8.清除session

request.session.delete() # 只删服务端的 客户端的不删
request.session.flush() # 浏览器和服务端都清空(推荐使用)

9.使用清除session

# 删除session
def del_session(request):
request.session.delete()
return HttpResponse('删除')

image


10.session是保存在服务端的 但是session的保存位置可以有多种选择

1.MySQL
2.文件
3.redis
4.memcache


推荐阅读
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 数据库锁的分类和应用
    本文介绍了数据库锁的分类和应用,包括并发控制中的读-读、写-写、读-写/写-读操作的问题,以及不同的锁类型和粒度分类。同时还介绍了死锁的产生和避免方法,并详细解释了MVCC的原理以及如何解决幻读的问题。最后,给出了一些使用数据库锁的实际场景和建议。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
author-avatar
学习小菜鸟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有