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小时内删除。
留言与评论(共有 0 条评论) |