cookies是什么

更新时间:2022-12-28 12:51:16 阅读: 评论:0


2022年12月28日发(作者:祈使句反义疑问句)

Session会话与Cookie简单说明

会话(Session)跟踪是Web程序中常⽤的技术,⽤来跟踪⽤户的整个会话。常⽤的会话跟踪技术是Cookie与Session。Cookie通过在客户

端记录信息确定⽤户⾝份,Session通过在服务器端记录信息确定⽤户⾝份。经常有⼈会疑惑:Session会话与Cookies的区别是什么?⽤户

登录的原理是什么?⽹站是如何认证的?它怎么知道是哪个⽤户从哪⼉登录进来的?下⾯将对这些问题进⾏⼀⼀解答。

Cookie机制

在程序中,会话跟踪是很重要的事情。理论上,⼀个⽤户的所有请求操作都应该属于同⼀个会话,⽽另⼀个⽤户的所有请求操作则应该属于

另⼀个会话,⼆者不能混淆。例如,⽤户A在超市购买的任何商品都应该放在A的购物车内,不论是⽤户A什么时间购买的,这都是属于同⼀

个会话的,不能放⼊⽤户B或⽤户C的购物车内,这不属于同⼀个会话。⽽Web应⽤程序是使⽤HTTP协议传输数据的。HTTP协议是⽆状态

的协议。⼀旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建⽴新的连接。这就意味着服务器⽆法从连接上跟踪会

话。即⽤户A购买了⼀件商品放⼊购物车内,当再次购买商品时服务器已经⽆法判断该购买⾏为是属于⽤户A的会话还是⽤户B的会话了。要

跟踪该会话,必须引⼊⼀种机制。Cookie就是这样的⼀种机制。它可以弥补HTTP协议⽆状态的不⾜。在Session出现之前,基本上所有的

⽹站都采⽤Cookie来跟踪会话。

什么是Cookie

Cookie意为"甜饼",是由W3C组织提出,最早由Netscape社区发展的⼀种机制。⽬前Cookie已经成为标准,所有的主流浏览器如IE、

Netscape、Firefox、Opera等都⽀持Cookie。由于HTTP是⼀种⽆状态的协议,服务器单从⽹络连接上⽆从知道客户⾝份。怎么办呢?就给

客户端们颁发⼀个通⾏证吧,每⼈⼀个,⽆论谁访问都必须携带⾃⼰通⾏证。这样服务器就能从通⾏证上确认客户⾝份了。这就是Cookie的

⼯作原理。Cookie实际上是⼀⼩段的⽂本信息。客户端请求服务器,如果服务器需要记录该⽤户状态,就使⽤respon向客户端浏览器颁

发⼀个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该⽹站时,浏览器把请求的⽹址连同该Cookie⼀同提交给服务器。服

务器检查该Cookie,以此来辨认⽤户状态。服务器还可以根据需要修改Cookie的内容。

Cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()⽅法与tMaxAge(intmaxAge)⽅法来读写

maxAge属性。如果maxAge属性为正数,则表⽰该Cookie会在maxAge秒之后⾃动失效。浏览器会将maxAge为正数的Cookie持久化,即

写到对应的Cookie⽂件中。⽆论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录⽹站时该Cookie仍然有效。下⾯代码中的

Cookie信息将永远有效。

Session机制

除了使⽤Cookie,Web应⽤程序中还经常使⽤Session来记录客户端状态。Session是服务器端使⽤的⼀种记录客户端状态的机制,使⽤上

⽐Cookie简单⼀些,相应的也增加了服务器的存储压⼒。

什么是Session

Session是另⼀种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,⽽Session保存在服务器上。客户端浏览器访问服务器的

时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态

就可以了。如果说Cookie机制是通过检查客户⾝上的“通⾏证”来确定客户⾝份的话,那么Session机制就是通过检查服务器上的“客户明细

表”来确认客户⾝份。Session相当于程序在服务器上建⽴的⼀份客户档案,客户来访的时候只需要查询客户档案表就可以了。Session的使

⽤⽐Cookie⽅便,但是过多的Session存储在服务器内存中,会对服务器造成压⼒。

Session的⽣命周期

Session保存在服务器端。为了获得更⾼的存取速度,服务器⼀般把Session放在内存⾥。每个⽤户都会有⼀个独⽴的Session。如果

Session内容过于复杂,当⼤量客户访问服务器时可能会导致内存溢出。因此,Session⾥的信息应该尽量精简。Session在⽤户第⼀次访问

服务器的时候⾃动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建

Session。如果尚未⽣成Session,也可以使⽤sion(true)强制⽣成Session。Session⽣成后,只要⽤户继续访问,服务器就

会更新Session的最后访问时间,并维护该Session。⽤户每访问服务器⼀次,⽆论是否读写Session,服务器都认为该⽤户的Session“活跃

(active)”了⼀次。

Session的有效期

由于会有越来越多的⽤户访问服务器,因此Session也会越来越多。为防⽌内存溢出,服务器会把长时间内没有活跃的Session从内存删除。

这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就⾃动失效了。Session的超时时间为

maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过tMaxInactiveInterval(longinterval)修改。Session的超时时

间也可以在中修改。另外,通过调⽤Session的invalidate()⽅法可以使Session失效。

ssion与cookie的简单区别

ssion和cookie本质上确实是两个东西,但cookie同时也是ssionid的载体,cookie保存ssionid。

cookie数据存放在⽤户的浏览器上,ssion数据放在⽹站的服务器上。

ssion保存在服务器端与浏览器设置⽆关,cookie在客户端并受浏览器设置限制。

cookie是在你的电脑浏览器上保存的,ssion是在⽹站服务器上的.也就是说你换⼀个电脑你的cookie就不起作⽤了,⽽ssion只要你的浏览

器不关就还能访问到.

通常的都是两者结合着⽤的.cookie的话你⾃⼰就可以通过对浏览器的设置禁⽤掉.这样就不起作⽤了

cookie不是很安全,别⼈可以分析存放在本地的cookie并进⾏cookie欺骗,考虑到安全应当使⽤ssion。

ssion是服务器端缓存,cookie是客户端缓存。

cookie机制采⽤的是在客户端保持状态的⽅案,⽽ssion机制采⽤的是在服务器端保持状态的⽅案

ssion会在⼀定时间内保存在服务器上。当访问增多,会⽐较占⽤你服务器的性能,考虑到减轻服务器性能⽅⾯,应当使⽤cookie。

ssion是服务器保持客户端状态信息的⽅案,⼀般是保存在服务器中的⼀块内存中,ssion超时时间在服务器端进⾏设置。

cookie是客户端保持⽤户信息的⽅案,⼀般是⽂件形式保存,cookie清空时间是在客户端浏览器设置。

从开发⾓度说,ssion信息可以通过技术⽅案写到客户端保存,cookie中的⽤户信息,也可以在⽤户访问该⽹站时,通过技术⼿段⾃动更

新⽤户的ssion信息。

单个cookie保存的数据不能超过4K,很多浏览器都限制⼀个站点最多保存20个cookie。

建议:将登陆信息等重要信息存放为ssion;其他信息如果需要保留,可以放在cookie中.

⽤户登录的原理是什么?

每次⽤户在⽹站的登录页⾯中输⼊⽤户名和密码时,这些信息都会发送到服务器。服务器随后会将你的密码与服务器中的密码进⾏验证。

如果两者不匹配,则你会得到⼀个错误密码的提⽰。如果两者匹配,则成功登录。

⽤户登录时发⽣了什么?

登录后,web服务器会初始化⼀个会话ssion并在你的浏览器中设置⼀个cookie变量。该cookie变量⽤于作为新建会话的⼀个引⽤。

搞晕了?让我们说的再简单⼀点。

会话的原理是什么?

服务器在⽤户名和密码都正确的情况下会初始化⼀个会话。会话的定义很复杂,可以把它理解为“关系的开始”。

认证通过后,服务器就开始跟⽤户展开⼀段关系了。由于服务器不能象我们⼈类⼀样看东西,它会在我们的浏览器中设置⼀个cookie来将

我们的关系从其他⼈与服务器的关系标识出来。

Cookie是⼲什么的?

cookie是⽹站在⽤户的浏览器中存储的⼀⼩段数据。当⽤户登录后,服务器为⽤户创建⼀段关系或者说⼀个会话,然后将唯⼀标识这个会话

的会话id以cookie的形式存储在⽤户的浏览器中。所有这些东西存在的原因在于识别出⽤户来,这样当⽤户写评论或者发推时,服务器能

知道是谁在发评论,是谁在发推。当⽤户登录后,会产⽣⼀个包含会话id的cookie。这样,这个会话id就被赋予了那个输⼊正确⽤户名和

密码的⼈了。也就是说,会话id被赋予给了拥有这个账户的⼈了。之后,所有在⽹站上产⽣的⾏为,服务器都能通过他们的会话id来判断

是由谁发起的。

如何让⽤户保持登录状态?

会话有⼀定的时间限制。这⼀点与现实⽣活中不⼀样,现实⽣活中的关系可以在不见⾯的情况下持续很长⼀段时间,⽽会话具有时间限制。

⽤户必须要不断地通过⼀些动作来告诉服务器⽤户还在线。否则的话,服务器会关掉这个会话,⽽⽤户会被登出。不过在某些⽹站上可以启

⽤"保持登录"功能,这样服务器会将另⼀个唯⼀变量以cookie的形式保存到我们的浏览器中。这个唯⼀变量会通过与服务器上的变量进⾏对

⽐来实现⾃动登录。若有⼈盗取了这个唯⼀标识(我们称之为cookiestealing),他们就能访问⽤户的账户了。

其他

1)由于Http协议是⽆状态的,服务端如何识别客户端请求呢,只能依靠http报⽂中新增部分头字段来实现请求识别(如何在请求body或这参

数中设置会员参数,服务器端会话就与⾃定义的会员识别绑定到⼀起)

2)基于浏览器的web应⽤,请求都是有浏览器发起的,貌似也不能⼿动随便添加请求头(仅有XMLHttpRequest可以⼿动设置请求头),哪

有没有⼀种可以由服务端⽣成,客户端请求是⾃动在请求中设置对应头字段的技术呢,这就是cookie

Cookie:

cookie是在客户端负责保存的,既可以客户端⽣成,也可以服务器端⽣成,Cookie总是保存在客户端中,按在客户端中的存储位置,可分为

内存Cookie和硬盘Cookie:

1)内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的

2)硬盘Cookie保存在硬盘⾥,有⼀个过期时间,除⾮⽤户⼿⼯清理或到了过期时间,硬盘Cookie不会被删除

3)cookie⼀些重要的属性,path,domain,maxAge,cure,httponly,可以⾃⼰去研究⼀下

4)服务端⽣成cookie的响应头为Set-Cookie:JSESSIONID=164A9B3B768FD959AA20505D4C09;Path=/;HttpOnly

5)客户端发送http请求带的cookie请求头Cookie:AMCV_niwodai%40AdobeOrg=-15069…7-badf-4795-9c64-eb9960c23d48

Session的实现原理:

1)服务端⾸先查找对应的cookie的值(ssionid)

2)根据ssionid,从服务器端ssion存储中获取对应id的ssion数据,进⾏返回

3)如果找不到ssionid,服务器端就创建ssion,⽣成ssionid对应的cookie,写⼊到响应头中

ssion共享实现(如tomcatssion会话共享)

传统的ssion由服务器端⽣成并存储,当应⽤进⾏分布式集群部署的时候,如何保证不同服务器上ssion信息能够共享呢?

两种实现⽅式:n集中存储(redis,memcached,hba等),2.不同服务器上ssion数据进⾏复制,两种⽅式的优缺点,⼤家应

该⼀⽬了然

基于ssion集中存储的实现⽅案:

1)新增Filter,拦截请求,包装HttpServletRequest

2)改写getSession⽅法,从ssion存储中获取ssion数据,返回⾃定义的HttpSession实现

3)在⽣成新Session后,写⼊ssionid到cookie中

Redis存储ssion的需要考虑问题:

1)ssion数据如何在Redis中存储?

2)ssion属性变更何时触发存储?

实现思路:

考虑到ssion中数据类似map的结构,采⽤redis中hash存储ssion数据⽐较合适,如果使⽤单个value存储ssion数据,不加锁的情况

下,就会存在ssion覆盖的问题,因此使⽤hash存储ssion,每次只保存本次变更ssion属性的数据,避免了锁处理,性能更好;

如果每改⼀个ssion的属性就触发存储,在变更较多ssion属性时会触发多次redis写操作,对性能也会有影响,我们是在每次请求处理完

后,做⼀次ssion的写⼊,并且之写⼊变更过的属性

如果本次没有做ssion的更改,是不会做redis写⼊的,仅当没有变更的ssion超过⼀个时间阀值(不变更ssion刷新过期时间的阀

值),就会触发ssion保存,以便ssion能够延长有效期

本文发布于:2022-12-28 12:51:16,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/46731.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:sequoia
下一篇:apologise
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图