Cookie机制

Cookie机制

Cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 IETF RFC 2965 HTTP状态管理机制是一种通用的cookie规范。 Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie。

具体来说,cookie机制使用一种在客户端维护状态的方案。它是客户端会话状态的存储机制,他需要用户打开客户端的cookie支持。 Cookie的作用是解决HTTP协议中缺少无状态缺陷的问题。

通过扩展HTTP协议来实现正统cookie分发。服务器通过向HTTP响应头添加特殊指示来提示浏览器生成相应的cookie。但是,纯JavaScript等客户端脚本也可以生成cookie。根据某些原则,浏览器在后台自动将cookie的使用发送到服务器。浏览器检查所有存储的cookie。如果cookie声明范围大于或等于要请求的资源的位置,则cookie将附加到请求资源的HTTP请求标头并发送到服务器。

cookie的内容主要包括:名称,值,到期时间,路径和域。路径与域一起构成了cookie的范围。如果未设置到期时间,则表示此cookie的生命周期是在浏览器会话期间,浏览器窗口关闭,并且cookie消失。生命周期为浏览器会话的cookie称为会话cookie。会话cookie通常不存储在硬盘上,而是存储在内存中。当然,这种行为不受监管。如果设置了到期时间,浏览器会将cookie保存到硬盘,关闭它并再次打开浏览器。在超过设定的到期时间之前,这些cookie仍然有效。存储在硬盘上的Cookie可以在不同的浏览器进程之间共享,例如两个IE窗口。不同的浏览器对存储在内存中的cookie有不同的处理方法。会话机制使用维护服务器端状态的解决方案。同时,我们也看到,由于服务器端状态保存方案还需要在客户端保存标识符,会话机制可能需要使用cookie机制来达到保存标识符的目的。会话提供了一种管理全局变量的便捷方法。

该会话适用于每个用户。变量的值存储在服务器上。 sessionID用于区分使用哪个用户会话变量。当用户访问浏览器时,该值将返回给服务器。当客户端禁用cookie时,此值也可以设置为通过get返回给服务器。

在安全性方面:当您访问使用会话并在您自己的计算机上创建cookie的站点时,建议服务器端的会话机制更安全,因为它不会任意读取客户端存储的信息。

Session会话机制

session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。

当程序需要为客户端的请求创建会话时,服务器首先检查客户端的请求是否包含会话标识符(称为会话ID)。如果包含它,它先前已为此客户端创建了一个会话。服务器根据会话ID检索会话(无法检索,将创建新会话),如果客户端请求不包含会话ID,则为客户端创建会话并生成与会话关联的会话ID。 session id应该是一个既不重复也不容易被复制的字符串。会话ID将返回给客户端以保存此响应。

保存此会话ID的方法可以是cookie,以便浏览器可以根据交互期间的规则自动将此标志用于服务器。通常,此cookie的名称与SEEESIONID类似。但是,cookie可以被人为禁止,因此必须有其他机制在禁用cookie时将会话ID传递回服务器。经常使用的一种技术称为URL重写,它只是将会话ID直接附加到URL路径。还有一种称为形式隐藏字段的技术。也就是说,服务器将自动修改表单并添加隐藏字段,以便在提交表单时将会话ID传递回服务器。

Cookie和Sessions都能够进行会话跟踪,但原则并不相同。一般情况下,两者都可以满足需求,但有时候他们不能使用cookies,有时候不能使用Session。以下是两者和适用场所的特征比较。

1.不同的访问方法

只有ASCII字符串可以存储在cookie中。如果需要访问Unicode字符或二进制数据,则需要先对其进行编码。无法在cookie中直接访问Java对象。要存储稍微复杂的信息,使用cookie会更难。

会话可以访问任何类型的数据,包括但不限于字符串、Integer、List、Map等。 Session也可以直接存储Java Beans甚至任何Java类,对象等,使用起来非常方便。将Session视为Java容器类。

2.不同的隐私政策

Cookie存储在客户端阅读器中,对客户端可见。客户端上的某些程序可能会窥探、副本以更正cookie的内容。会话存储在服务器上,对客户端是透明的。不存在敏感信息泄露的风险。

如果您选择cookie,最好不要写敏感信息,如帐户密码。最好加密像Google、Baidu这样的cookie信息,并将其提交给服务器进行解密,以确保我自己可以读取cookie中的信息。如果选择Session,则可以省去很多麻烦。无论如何,它被放置在服务器上,并且会话中的任何隐私都可以得到有效保护。

3.有效期的差异

使用Google的任何人都知道,如果您已登录Google,Google的登录信息将长期有效。用户每次访问时都不必再次登录,Google会永久记录用户的登录信息。要达到这个效果,使用cookies将是一个不错的选择。只需将cookie的到期时间属性设置为一个非常大的数字。由于Session依赖于名为JSESSIONID的cookie,并且Cookie JSESSIONID的到期时间默认为-1,因此只需关闭阅读器就会使Session无效,Session将无法永久完成信息。无法使用URL地址重写。此外,如果设置Session的超时时间太长,服务器将累积的Sessions越多,导致内存溢出的可能性就越大。

4.不同的服务器压力

会话保留在服务器端,每个用户都将生成一个会话。如果有很多并发用户,它会产生大量的Session并消耗大量内存。因此,具有高并发流量的站点(如Google、Baidu、Sina)不太可能使用Session来跟踪客户会话。

Cookie保留在客户端上,不消耗服务器资源。如果有很多用户同时阅读,那么cookie是一个不错的选择。关于Google、Baidu、Sina,cookies可能是唯一的选择。

5.不同的浏览器支持

客户端浏览器需要支持Cookie。如果客户端禁用cookie或不支持cookie,则会话跟踪将无效。关于WAP上的应用程序,常规cookie无用。

如果客户端浏览器不支持cookie,则需要使用会话和URL地址重写。应该注意的是,Session程序中使用的所有URL都必须重写URL地址,否则会话会话跟踪将无效。对于WAP应用程序,会话+ URL地址重写可能是唯一的选择。

如果客户端支持cookie,则可以在浏览器窗口和子窗口中将cookie设置为有效(将到期时间设置为-1),或者可以将cookie设置为在所有阅读器窗口中有效(设置到期时间)大于1)0的整数。但是,Session只能在此阅读器窗口及其子窗口中使用。如果两个浏览器窗口彼此不相关,则它们将使用两个不同的会话。 (与IE8下不同窗口相关的会话)

6.跨域支持的差异Cookie支持跨域访问。例如,如果domain属性设置为“.biaodianfu.com”,则所有以“.biaodianfu.com”为后缀的域名都可以访问cookie。跨域cookie现在通常在网络上使用,例如Google、Baidu、Sina。会话不支持跨域访问。会话仅在其所在的域名内有效。

仅使用cookie或仅使用Sessions可能无法达到预期的效果。此时,您应该尝试使用Cookie和会话。 Cookie和Sessions的组合将在练习项目中实现许多意想不到的结果。

我的理解:

1.由于HTTP协议是无状态协议,当服务器需要记录用户的状态时,需要一些机制来识别特定用户。这个机制是Session。点击下订单时,购物车等典型场景使用按钮时,由于HTTP协议是无状态的,因此不知道哪个用户在运行。因此,服务器需要为特定用户创建特定会话,该会话用于识别用户并跟踪用户,以便知道购物车。有几本书。此会话存储在服务器上,并具有唯一标识符。有很多方法可以在服务器端保存会话,内存、数据库、文件有它。在群集中,您还应该考虑转移会话。在大型网站上,将有一个特殊的会话服务器群集来保存用户会话。此时,会话信息存储在内存中,并使用一些缓存服务,如Memcached。来吧,把会议。2.考虑服务器如何识别特定客户?此时,cookie已出现在场景中。每次发出HTTP请求时,客户端都会将相应的cookie信息发送到服务器。事实上,大多数应用程序使用cookie来实现会话跟踪。在第一次创建会话时,服务器将告诉HTTP协议中的客户端需要在cookie中记录会话ID。会话ID被发送到服务器,我知道你是谁。有人问,如果客户端的浏览器禁用了cookie,该怎么办?在这种情况下,称为URL重写的技术用于会话跟踪。也就是说,每个HTTP交互,诸如sid = xxxxx之类的URL被附加到URL,并且服务器相应地识别用户。

3. Cookie也可用于某些用户友好的场景。想象一下,您已经登录过一次网站。下次登录时,您不想再次输入帐户。我该怎么办?此信息可以写入cookie。访问网站时,网站页面的脚本可以读取此信息,并自动为您填写用户名,方便用户使用。这也是cookie名称的起源,给用户一点点甜蜜。

所以,总结一下:

Session是保存在服务器上的数据结构,用于跟踪用户的状态。此数据可以保存在群集、数据库、文件中。

Cookie是客户端存储用户信息的机制。它用于记录有关用户的一些信息,是实现会话的一种方式。

1.状态保持

http协议是无状态的:每个请求都是一个新请求,并且不会记住先前通信的状态。

客户端和服务器之间的一次通信是会话实现状态保留的方法:在客户端或服务器端存储与会话相关的数据存储方法包括cookie、session,会话通常是指会话对象。使用cookie,所有数据都存储在客户端上,注意不要存储敏感信息建议使用sesison模式,所有数据都存储在服务器端,session_id存储在客户端cookie中。状态保持的目的是在一段时间内跟踪请求者的状态,并实现对当前请求者的数据的跨页访问。注意:不同请求者之间不会共享此数据,与请求者一一对应

2.Session会话(示例Django)·默认情况下启用使用django-admin startproject创建的项目

·在settings.py文件中

在INSTALLED_APPS列表中添加:

'django.contrib.sessions',

在MIDDLEWARE_CLASSES列表中添加:

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

·禁用会话:删除上面指定的两个值,禁用会话将保存一些性能

3.使用session

·启用会话后,每个HttpRequest对象都将具有会话属性,该属性是类字典对象

Get(key,default = None):根据密钥获取会话的值

Request.session.get(“UNAME”,””)

·clear():清除所有会话

Flus():删除当前会话数据并删除会话的cookie

Del request.session ['uname']:删除会话

4.session到期时间

Set_expiry(value):设置会话的超时时间

·如果未指定,则在两周后过期

·如果value是整数,则会话值将在值秒内没有活动后到期

·如果值是timedelta对象,则会话将在当前时间加上指定的日期/时间到期

·如果value为0,则用户会话的cookie将在用户的浏览器关闭时到期

·如果value为None,则会话永不过期

Cookie和Session的区别

1、Cookie是存在客户端,Session存在服务器

2、安全性要求高的用Session,要求低用Cookie

3、Cookie只能存储字符串,Session可以存储任何信息

4、Cookie如果不设置时间,当关闭浏览器时,Cookie就失效,不会在本地保存;Session的生命周期是一个会话(当启动浏览器到关闭浏览器)

5、在存储相对持久的信息时,应考虑使用 Cookie,因为 Cookie 可以以文件的形式,存储在客户端。在进行一些登录的验证及信息拦截的时候,可以使用 Session。

引用:

https://blog.csdn.net/weixin_42808295/article/details/81290306

https://www.cnblogs.com/shoshana-kong/p/10669889.html

Session Cookie介绍和使用的更多相关文章

  1. Session&Cookie 的介绍和使用

    Session介绍与使用 1.Session基本介绍 Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序 ...

  2. cookie和session的介绍

    1.cookie和session cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此产生cookie. cookie的工作原理是:由服务器产生 ...

  3. Asp.net MVC使用Model Binding解除Session, Cookie等依赖

    上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖.其实这个也可以通 ...

  4. Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...

  5. [转]Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文转自:http://www.cnblogs.com/JustRun1983/p/3279139.html 本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应 ...

  6. [转载]JavaEE学习篇之——Session&&Cookie

    原文链接: http://blog.csdn.net/jiangwei0910410003/article/details/23337043 今天继续来看看JavaWeb的相关知识,这篇文章主要来讲一 ...

  7. Application,Session,Cookie,ViewState和Cache区别

    在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等.下面分别介绍它们的用法和区别. 方法 信息量大小 作用域和保 ...

  8. 转载ASP.NET 状态管理Application,Session,Cookie和ViewState用法

    转载原地址 http://www.cnblogs.com/cuishao1985/archive/2009/09/24/1573403.html ASP.NET状态管理 APPlication,Ses ...

  9. ASP.NET Application,Session,Cookie和ViewState等对象用法和区别 (转)

    在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等.下面分别介绍它们的用法和区别. 方法 信息量大小 作用域和保 ...

随机推荐

  1. .call() 与 .apply() 的用法及区别

    首先说明两个方法的含义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法.call:调用一个对象的一个方法,用 ...

  2. Light OJ 1085 - All Possible Increasing Subsequences

    题目 link 给定一个序列, 求出上升子序列的总数. 分析 Dp[i] 表示序列 以 i 结尾的数目. 可知 Dp[i]=∑Dp[x]+1 这是一个前缀和, 用树状数组维护. Code #inclu ...

  3. form表单老忘的

    禁止拉伸 textarea{ resize:none; } 左侧 label 对齐注意事项 必须要和 label-width 共同使用,才会生效. 表单域标签的宽度,直接写入 Form, 子元素 fo ...

  4. Python base64编码,转图片

    我在做火车票抢票器的时候遇到一个问题,就是验证码提取的:一般验证码都是一些http请求的url,但是火车票网站遇到了我没有见过的以data:image/jpg;base64开头的字符串.现在我们就用P ...

  5. 生产宕机dunp配置

    修改线程数 <self-tuning-thread-pool-size-min>100</self-tuning-thread-pool-size-min> <self- ...

  6. echarts 隐藏Y轴最大最小值label及分割线 ----障眼大发好使

    需求图 1====>label 最大最小值还好弄, yAxis{ axisLabel{ showMinLabel: false, showMaxLabel: false, }} 2====> ...

  7. Java Swing 编程 JComboBox 显示不全问题。

    最近在做Java Swing编程一个小例子.然后遇到JComboBox 宽度固定,而下拉列表比较长,导致显示不全的问题. 解决的思路想到两种,1:下拉列表当显示不全的时候,换行显示.2:在下拉列表停几 ...

  8. podman(libpod)---github简单记录

    这个应该集成了Skopeo 和Buildah. 用于代替docker的工具包,且和cri-o共享后端代码,迟早集成进K8S~~~. (docker肿么办????) github地址: https:// ...

  9. Java练习2

    1 编写一个应用程序,模拟机动车的加速和减速功能.机动车类Vehicle的UML图如下,其中speedUp()方法实现加速功能,速度上限为240 km/h:speedDown()实现降速功能,下限为0 ...

  10. 【webpack系列】从零搭建 webpack4+react 脚手架(四)

    经过三个章节的学习,你已经学会搭建了一个基于webpack4的react脚手架.如果要更改配置,比如,你希望把编译后的js文件和css文件等单独放dist下的static目录下,你想想,是不是有点麻烦 ...