再看Session和Cookie

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1.Session

Session的机制

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

1.将数据存储在服务器端的机制,本身是一种HashTable结构;
2.客户端第一次发出请求时,服务器会自动生成hashTable用来存储数据,以及sessionID用来作为唯一标示,通过响应返回给客户端。其中sessionID是作为Cookie保存在客户端;
3.当客户端第二次请求时,服务器从请求中提取sessionID,与服务器的sessionID进行对比,找出对应的hashTable;
4.session默认存活时间为30分钟。

参考文章:
https://blog.csdn.net/Routine_limon/article/details/86749878

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

Session的生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session在用户第一次访问服务器的时候自动创建。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

Session的有效期

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

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

Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。

2.Cookie

cookie的机制

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

会话cookie和持久性cookie

cookie的存活期:默认为-1
会话Cookie:把Cookie保存到浏览器上,当存活期为负数
持久Cookie:把Cookie保存到文件中,当存活期为正数
设置存活期:c.setMaxAge();

会话cookie是一种临时cookie,它记录了用户访问站点时的设置和偏好,当用户退出浏览器时,会话cookie就会被删除。
持久cookie的生存时间更长一些,它存储在用户的硬盘上,浏览器退出或计算机重启时他们仍然存在。

参考文章:
https://www.jianshu.com/p/25802021be63
https://blog.csdn.net/p77ll9l53x/article/details/72675645

Cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。
如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。

如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。

如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。

Persistent cookies和Session cookies的定义与区别:

1.Session Cookies

Session Cookies是临时的cookie文件, 在你关闭浏览器之后就会失效并被删除掉.

当你重启你的浏览器, 并再回到之前为你创建cookie的站点的时候, 这个站点不会认识你的. 你必须重新登录. 登录之后, 一个新的session cookie会被生成. 你的浏览信息会被存储在这个新的cookie中, 这个cookie会一直保持active的状态, 直到你再次关闭浏览器.

Session Cookie仅能被浏览器使用. 其他应用程序不能共享.

2.Persistent Cookies

Persistent Cookies会被保存在一个浏览器的一个子文件夹中, 除非手动删除或者浏览器定期清理, 否则会一直存在.

Persistent Cookie是可以在多个应用程序间共享的, 前提是这些应用程序可以访问相同的cookie store. 默认情况下Persistent Cookie的过期时间是30分钟.

参考文章:
https://www.cnblogs.com/awpatp/archive/2010/10/24/1859756.html

Cookie的限制

Cookie的限制主要有两条:
1.访问cookie时的同源限制
2.Cookie的个数和尺寸限制

同源限制:
Cookie在性质上是绑定在特定的域名下的。当创建了一个cookie后,再给创建它的域名发送请求时,请求头中都会包含这个cookie。这个限制确保了储存在cookie中的信息只能让批准的域访问,而无法被其他域访问。

个数和尺寸限制:
每个域名下可绑定的cookie的个数是有限的,不同浏览器所限制的个数不同。

Cookie有两个很重要的属性:Domain和Path,用来指示此Cookie的作用域:

Domain告诉浏览器当前要添加的Cookie的域名归属,如果没有明确指明则默认为当前域名,比如通过访问www.vinceruan.info添加的Cookie的域名默认就是www.vinceruan.info,通过访问blog.vinceruan.info所生成的Cookie的域名就是blog.vinceruan.info

Path告诉浏览器当前要添加的Cookie的路径归属,如果没有明确指明则默认为当前路径,比如通过访问www.vinceruan.info/java/hotspot.html添加的Cookie的默认路径就是/java/,通过blog.vinceruan.info/java/hotspot.html生成的Cookie的路径也是/java/
在这里插入图片描述
所以,domain属性决定运行访问Cookie的域名,而path属性决定允许访问Cookie的路径(ContextPath)。

参考文章:
https://www.cnblogs.com/liaojie970/p/7606168.html
https://www.jianshu.com/p/b2337afcc9b6

利用URL重写解决Cookie禁用导致的sessionID问题

上一篇文章已经提过,sessionID通过cookie保存在客户端,如果将cookie禁用,必将对session的使用造成一定的影响。而解决这个问题的办法是:URL重写。

URL重写就是即每次HTTP交互,URL后面都会被附加上一个诸如sid=xxxxx这样的参数,服务端据此来识别用户。

如果用户禁止了所有cookie的使用,那么会话cookie和持久化cookie都不能用了,有个方案也可以解决问题,就是URL重写。

参考文章:
https://blog.csdn.net/Routine_limon/article/details/86755586

3.Session和Cookie比较

总结一下:
1.Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
2.Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式

比较:
1.cookie数据存放在客户的浏览器上,session数据放在服务器上
2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
3.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE
4.单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K

区别:
1.安全性: cookie存于客户端,存在被修改的风险,不安全;session存于服务器,不可修改,安全;
2.消耗资源: session需要消耗服务器资源,过多时会造成服务器内存溢出;cookie存于客户端,服务器资源消耗小;
3.域的支持: cookie可以跨域名使用,只要设置时后缀一致即可;而session不能够跨域,需要使用JSONP或跨域资源共享解决。

cookie与session的关联:
上文提到服务器的session是通过sessionID进行区别,而sessionID是通过cookie存于客户端本地,并随着每次请求都发送给服务器。
所以session的使用与cookie存在着关联,当用户在浏览器设置了“禁用cookie”时,会对session的使用造成一定的影响。

使用场景:
session与cookie都可以用于用户的登录状态保持上,但是当网站的并发量大时,可能会造成session过多,服务器内存溢出。
解决方案:配置一台专门用于存储session的资源服务器,或使用cookie进行用户的登录状态保持。

cookie与session配合使用,使用登录状态保持的思路:
将用户的密码与账户,以及sessionID进行加密,再存于cookie中发送回客户端保存;服务器session同样保存用户信息,但是当session过期,或session过多时清除多余的session,保证服务器内存不会溢出;当用户第二次登录时,取出cookie中的sessionID进行对比,若该session存在则继续使用,若不存在,则使用cookie中的密码与账户进行登录,并更新cookie的sessionID。而这个操作在用户所没有看到的背后进行,以此达到“记住密码”的效果。

参考文章:
https://blog.csdn.net/Routine_limon/article/details/86749878
https://blog.csdn.net/shiyaru1314/article/details/70142353/
https://www.rainonline.cc/sessionhe-cookiede-qu-bie-ji-sessionde-sheng-ming-zhou-qi/
https://blog.csdn.net/fangaoxin/article/details/6952954
https://blog.csdn.net/shuaishenkkk/article/details/8634917
https://blog.csdn.net/qq_27694623/article/details/72601954
https://blog.csdn.net/ycc1943/article/details/72398735
https://blog.csdn.net/Kincym/article/details/71305502
https://blog.csdn.net/weixin_42139757/article/details/80467518
https://blog.csdn.net/zhang1409399037/article/details/84671740
https://blog.csdn.net/mingzi_Andy/article/details/80954674

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值