day62

Cookie与Session的发展史详解

1.Cookie的发展史

  1. 1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户在网站上的活动。
  2. 初始版本的Cookie只能存储很少的数据,并且没有强制加密机制,容易被恶意用户篡改或窃取。因此,随着互联网的快速发展,Cookie引起了一系列安全和隐私问题。

2.Session的发展史

  1. 由于Cookie存在的局限性,Web开发人员开始寻找更安全、可靠的替代方案。1997年,Sun Microsystems提出了基于服务器的会话管理方案,即Session。
  2. Session是在服务器端存储用户会话数据的一种技术。每当用户访问网站时,服务器会为其创建一个唯一的Session标识符(Session ID),并将会话数据存储在服务器上。
  3. Session ID一般通过Cookie或URL参数传递给客户端,用于识别用户的会话状态。

3.Cookie和Session的发展史

  1. 在实际应用中,Cookie和Session通常结合使用。当用户首次访问网站时,服务器会为其分配一个唯一的Session ID,并将其存储在Cookie中,发送给客户端保存。
  2. 随后,客户端在每次请求中都会携带该Cookie,服务器通过解析Cookie中的Session ID,读取对应的会话数据,实现用户状态的跟踪和管理。

4.总结

  1. Cookie和Session是Web应用程序中常用的用户会话跟踪技术。
  2. Cookie通过在客户端存储小型文本文件,并将会话标识符传递给服务器,实现会话状态的保持。
  3. 而Session则是在服务器端存储会话数据,通过Session ID实现对用户会话的追踪。
  4. 它们的发展历程与互联网的发展紧密相关,为开发人员提供了更多的选择,以保障安全性和用户体验的提升。

 Cookie与Session详解

  • 1 网站都没有保存用户功能的需求,所有用户访问返回的结果都是一样的

    • 例如新闻、博客、文章...
  • 2 出现了一些需要保存用户信息的网站

    • 例如淘宝、支付宝、京东...

 

  • 以登录功能为例:
    • 如果不保存用户登录状态,也就意味着用户每次访问网站都需要重复的输入用户名和密码
    • 这对用户来说,体验感极差
  • 解决办法:
    • 当用户第一次登陆成功之后,将用户的用户名和密码返回给用户浏览器,让用户浏览器 保存在本地
    • 之后访问网站的时候浏览器自动将保存在本地的用户名和密码发送给服务端,服务端获取之后自动验证
    • 但是具有极大的安全隐患
  • 优化
    • 当用户登陆成功之后,服务端产生一个随机字符串(在服务端保存数据,用K:V键值对的形式),交由客户端浏览器保存
    • 之后访问服务端的时候,都带着随机字符串,服务端去数据库中比对是否有匹配到的随机字符串,从而获得用户信息
    • 但是如果截获到当前随机字符串,那么就可以冒充当前用户,其实还是有极大的安全隐患
  • 在web领域没有绝对的安全和绝对的不安全

 Cookie

服务器保存在客户端浏览器上的信息都可以称之为cookie
它的表现形式一般都是key:value键值对(可以有多个)

Session

保存在服务器上的信息都可以称之为session
它的表现形式一般都是key:value(可以有多个)

token

  • session虽然数据是保存在服务端的,但是挡不住数据量大
  • 解决办法:服务端不再保存数据
    • 登陆成功之后,将一段信息加密处理(用自己独特的加密方式进行加密)
  • 将加密之后的结果拼接在信息后面,整体返回给浏览器保存
  • 浏览器下次访问的时候带着该信息,服务端自动切取前面的一段信息再次使用自己的加密算法进行加密
  • 然后用这段密文与携带过来的密文进行比对

总结

  • cookie就是保存在客户端浏览器上的信息
  • session就是保存在服务端上的信息
  • session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用cookie)

Django操作Cookie

  • 虽然cookie是服务端告诉客户端浏览器需要保存内容
  • 但是客户端浏览器可以选择拒绝保存
  • 如果禁止自动保存cookie
    • 那么只要是需要登录的网站都没办法正常登录了

视图函数的返回值

return HttpResponse()
return render()
return redirect()

变形

obj = HttpResponse()
return objobj1 = render()
return obj1obj2 = redirect()
return obj2

如果想要操作cookie,必须进行以上变形才可以

设置cookie

obj = HttpResponse()
obj.set_cookie(key,value)
return obj

获取cookie

request.COOKIES.get(key)

设置超时时间

obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 设置超时时间 5s 到期
return obj

max_age:设置超时时间,以秒为单位
expiress:设置超时时间 针对IE浏览器使用,以秒为单位

注销cookie

obj = HttpResponse()
# 设置超时时间 5s 到期
obj.delete_cookie(key)
return obj
  • 注意
    • 这里只是拿 HttpResponse 举例,并不是这个参数只能是 HttpResponse
  • 比如
    • 我们想下一步跳转到某一个功能时,可以是
obj =  redirect('/home/')
obj.delete_cookie(key)
return obj

登录功能实现

简单实现

def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 登陆成功之后,跳转到登陆成功之后才能看到的页面return redirect('/home/')return render(request, 'login.html')def home(request):return HttpResponse("登陆成功!")
<form action="" method="post"><p>username:<input type="text" name="username" class="form-control"></p><p>password:<input type="password" name="password" class="form-control"></p><input type="submit" class="btn btn-success">
</form>

问题:登陆成功之后的跳转页面,不需要登录也可以直接访问到,只需要给对应地址即可

解决登陆问题

from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 登陆成功之后,保存用户登陆状态obj = redirect('/home/')# 让浏览器记录cookieobj.set_cookie("sign", "1314521")'''浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie'''# 登陆成功之后,跳转到登陆成功之后才能看到的页面return objreturn render(request, 'login.html')def home(request):# 读取携带的cookie,cookie正确登陆成功if request.COOKIES.get("sign") == "1314521":return HttpResponse("登陆成功!")# 读取携带的cookie,cookie不正确跳转到登陆页面return redirect('/login/')

迭代-登录认证装饰器

用户如果没有登录的情况下想访问一个需要登录的页面
那么先跳转到登录页面,当用户输入正确的用户名和密码之后再跳转到用户之前想访问的页面去,而不是直接写死

from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 获取用户上一次想要访问的url# 结果可能为空 -- 直接访问logintag_url = request.GET.get('tag_url')if tag_url:obj = redirect(tag_url)else:# 登陆成功之后,保存用户登陆状态obj = redirect('/home/')# 让浏览器记录cookieobj.set_cookie("sign", "1314521")'''浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie'''# 登陆成功之后,跳转到登陆成功之后才能看到的页面return objreturn render(request, 'login.html')# 校验用户登录状态的装饰器
def auth_check(func):def inner(request, *args, **kwargs):# 获取到用户上一次想要访问的urltag_url = request.get_full_path()# 读取携带的cookie,cookie正确登陆成功if request.COOKIES.get("sign") == "1314521":res = func(request, *args, **kwargs)return reselse:# 读取携带的cookie,cookie不正确跳转到登陆页面return redirect(f'/login/?next={tag_url}')return inner@auth_check
def home(request):return HttpResponse("home登陆成功!")@auth_check
def index(request):return HttpResponse("index登陆成功!")@auth_check
def func(request):return HttpResponse("func登陆成功!")

Django操作Session

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

设置Session

request.session['key'] = value

获取Session

request.session.get('key')

设置/获取session多个值

  • 给session设置多个值的时候,存在数据库中的数据仍是一条
  • 但是在取session的时候,可以通过request.session对象获取到设置的多组键值对

django_sessoin表中的session数据 

  • django_sessoin表中的数据条数取决于浏览器
    • 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效
    • 同一个计算机(IP地址)上多个浏览器会有多个数据生效
    • 当session过期的时候,可能会出现多条数据对应一个浏览器
      • 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
  • 目的是为了节省服务器数据库资源

设置过期时间

# 设置session
request.session['key'] = value
# 设置过期时间
request.session.set_expiry()

参数:
   整数:多少秒过期
   日期对象:到指定日期失效
   0:一旦退出当前浏览器窗口就失效
   不写:失效时间取决于Django内部全局session失效的时间

清空session

1.request.session.delete()
只删除服务端的
该方法用于删除当前用户的Session数据,但会保留Session的key
这意味着Session对象本身仍然存在,但其中的数据将被清空
下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象

以下是使用request.session.delete()的示例

def clear_session(request):request.session.delete()# 其他操作或返回响应

2.request.session.flish()

服务端和客户端删除
该方法用于完全删除当前用户的session,包括session对象和所有相关数据
下次访问时,将创建一个新的空session对象

以下是使用request.session.flush()的示例

def clear_session(request):request.session.flush()# 其他操作或返回响应

保存

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

原理剖析

  • *request*.session['sign'] = "369"内部发生了哪些事

    • Django内部会自动帮我们生成一个随机字符串

    • Django内部自动将随机字符串和对应的数据存储到 django_sessoin 表中

      • 先在内存中产生操作数据的内存

      • 在响应经过Django中间件的时候才去操作数据数据库

        'django.contrib.sessions.middleware.SessionMiddleware',

    • 将产生的随机字符串返回给客户端浏览器保存

  • request.session.get("sign")内部发生了哪些事

    • 自动从浏览器请求中获取 sessionid 对应的随机字符串
    • 根据该随机字符串去django_session表中查找对应的数据
      • 如果匹配成功,则将对应的数据取出并以字典的形式封装到request.session
      • 如果匹配不成功,则request.session中的数据为None

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2021-42287CVE-2021-42278 域内提权

倘见玉皇先跪奏&#xff1a;他生永不落红尘 本文首发于先知社区&#xff0c;原创作者即是本人 前言 网络安全技术学习&#xff0c;承认⾃⼰的弱点不是丑事。只有对原理了然于⼼&#xff0c;才能突破更多的限制。拥有快速学习能力的白帽子&#xff0c;是不能有短板的&#xf…

Spring Framework IoC依赖注入-按Bean类型注入

Spring Framework 作为一个领先的企业级开发框架&#xff0c;以其强大的依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;机制而闻名。DI使得开发者可以更加灵活地管理对象之间的关系&#xff0c;而不必过多关注对象的创建和组装。在Spring Framework中&am…

Go语言读取文件内容

简介 读取文件内容在每个语言里面都有&#xff0c;go语言中主要注意文件读完后会返回一个异常 io.EOF&#xff0c;根据这个异常去判断就可以了 代码实现 package mainimport ("bufio""fmt""io""os" )func main() {lines : Read(&qu…

【20年扬大真题】编写程序,功能是从键盘输入若干4位数字学号,然后输出学号中百位数字是3的学号 (输入0时结束循环)

【20年扬大真题】 编写程序&#xff0c;功能是从键盘输入若干4位数字学号&#xff0c;然后输出学号中百位数字是3的学号 &#xff08;输入0时结束循环&#xff09; #include<stdio.h> #define MaxSize 20 int BaiWei3(int x) {x x / 100;if (x % 10 3) {return 1;}els…

Windows安装Hadoop运行环境

1、下载Hadoop 2、解压Hadoop tar zxvf hadoop-3.1.1.tar.gz3、设置Hadoop环境变量 3.1.1、系统环境变量 # HADOOP_HOME D:\software\hadoop-3.1.13.1.2、Path 环境变量 %HADOOP_HOME%\bin %HADOOP_HOME%\sbin3.1.3、修改Hadoop文件JAVA_HOME 注 : 路径中不要出现空格 ,…

TMUX设置鼠标滚轮滑动来浏览之前的前面内容

在Ubuntu上使用Tmux有时使用鼠标滚轮时&#xff0c;和平时使用终端的习惯不怎么一致&#xff0c;因此可以设置启用鼠标滚轮。 通过鼠标滚轮滑动来浏览之前的前面内容 具体方式&#xff1a; 1 按完前缀ctrlB后 2 再按冒号&#xff1a;(记得shift) 3 进入命令行模式(下方绿色栏变…

关于web端调用iOS系统的图库异常的问题

前端调用iOS系统图库时异常 好久没更新了&#xff0c;忙于生计。 近日开发中需要iOS客户端需要加载一个webview用于承载一些IM的聊天功能&#xff0c;对于iOS来说很简单&#xff0c;加载一个url即可&#xff0c;但是本人习惯于写成view添加到window上[UIApplication sharedApp…

蓝桥等考C++组别七级008

第一部分:选择题 1、C++ L7 (15分) 在判断是否满足循环条件之前,至少执行循环体语句一次的是哪种循环结构?( ) for循环while循环do-while循环以上都不是正确答案:C 2、C++ L7 (15分) 执行以下程序,会输出几个“*”?( ) for(int i = 0; i <= 10; i++){…

webpack之resolve模块解析

resolve官网配置地址 resolve官网概念地址 解析文件路径 绝对路径&#xff1a;由于已经获得文件的绝对路径&#xff0c;因此不需要再做进一步解析。 相对路径&#xff1a;在 import/require 中给定的相对路径&#xff0c;会拼接此上下文路径&#xff0c;来生成模块的绝对路径&…

前端面试算法之“时间复杂度

✨求关注~ &#x1f600;博客&#xff1a;www.protaos.com 欢迎添加我的微信 介绍 时间复杂度是算法效率的一个关键概念&#xff0c;用于衡量算法运行时间随输入规模增长的速度。在计算机科学中&#xff0c;我们经常面临着不同的算法选择&#xff0c;而了解它们的时间复杂度有助…

首选C++,彻底麻了!

“作为初学者&#xff0c;我应该选择什么语言?” 网上冲浪时&#xff0c;我经常看到上面这样的疑问。作为一个同样在这个选择上挣扎许久的人&#xff0c;我最终选择了C。我想&#xff0c;我可以就这个特定的选择以及它如何影响我之后的学习谈一下个人看法。 本文将围绕以下四…

Spring条件注解@Conditoinal+ Profile环境切换应用@Profile

Spring条件注解 一、创建一个maven项目 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.5.RELEASE</version></dependency> </dependenc…

局域网内Ubuntu上搭建Git服务器

1.在局域网内选定一台Ubuntu电脑作为Git服务端&#xff1a; (1).新建用户如为fbc&#xff0c;执行如下命令&#xff1a;需设置密码&#xff0c;此为fbc sudo adduser fbc (2).切换到fbc用户&#xff1a;需密码&#xff0c;此前设置为fbc su fbc (3).建一个空目录作为仓…

Linux 内核提权漏洞

提权方式 存在漏洞版本 exp/poc 参考 CVE-2021-33200 Linux kernel through 5.12.7 暂无 NVD - CVE-2021-33200 CVE-2021-31440 Linux kernel 5.11 through 5.12.2 【kernel exploit】CVE-2021-31440 eBPF边界计算错误漏洞&#xff08;Pwn2Own 2021&#xff09; — b…

UI自动化之Playwright简介

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

C++初阶--类型模板

文章目录 泛型编程函数模板使用通用加法函数多模板参数必须用实例化 函数模板的原理类模板使用 注意事项 泛型编程 先看一个例子&#xff1a; 这是一些对于Swap重载的函数&#xff0c;区别是类型不同&#xff1b; 虽然能够重载使用&#xff0c;但代码复用率比较低&#xff0c…

CSS元素的显示模式

一.什么是元素显示模式 元素显示模式就是元素&#xff08;标签&#xff09;以什么方式进行显示&#xff1b;比如&#xff1a;<div>独占一行&#xff0c;一行可以显示多个<span> HTML元素一般分为块元素和行内元素两种类型。 二.元素分类 1.块元素 常见的块元素有…

Java正则表达式之账号检验与判断基础

考虑到此时读者不知道何为正则表达式&#xff1a; 我需要验证一个字符串是否符合qq号码的规则&#xff0c;我们采取已有知识进行验证 import java.util.Scanner;public class Main{public static void main(String[] args){//正则表达式理解为一种规则//这种规则就是用来校验…

Python实现四个组成不相同且无重复的三位数

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 1.题目&#xff1a;有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; for i in range(1,…

2023感恩节大促:跨境卖家如何借助海外网红营销赢得市场关注

随着全球贸易的日益发展&#xff0c;跨境电商行业变得愈发竞争激烈&#xff0c;各家卖家纷纷寻找新的营销策略以在大促期间脱颖而出。在2023年感恩节即将来临之际&#xff0c;海外网红营销成为许多卖家关注的热点。本文Nox聚星将和大家探讨跨境卖家如何充分利用海外网红营销&am…