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