当前位置:   article > 正文

session拿request_让人琢磨不透的Session和Cookie

session获取request
9f89b2ee8b26ab9b1365ee0926be5f51.png

脚本之家

你与百万开发者在一起

9f89b2ee8b26ab9b1365ee0926be5f51.png

1fff379dbc97f0dead7d0731119c795e.gif

871472c9572583238c42e665e0ac5803.png

作者 | Love DN

出品 | 脚本之家(ID:jb51net)

web开发这么长时间了,session,cookie ,一直没有深入的理解,理论知识

Session与Cookie

由于http协议是无状态的协议,为了能够记住请求的状态,于是引入了SessionCookie的机制。我们应该有一个很明确的概念,那就是Session是存在于服务器端的,在单体式应用中,他是由Web容器(例如:tomcat)管理的,存在于容器的内存中,而Cookie则是存在于客户端,更方便理解的说法,可以说存在于浏览器。Cookie并不常用,至少在企业或者互联网开发中,并没有什么场景需要我们过多的关注Cookiehttp协议允许从服务器返回Response时携带一些Cookie,并且同一个域下对Cookie的数量有所限制,Session的持久化依赖于服务端的策略,而Cookie的持久化则是依赖于本地文件。虽然说Cookie并不常用,但是有一类特殊的Cookie却是我们需要额外关注的,那便是与Session相关的sessionId,他是真正维系客户端和服务端的桥梁。

Cookie的分类

按照存储的物理介质区分,一类是在web容器的,一类是存储在硬盘的

拿tomcat来说,

1、当请求到达,tomcat会创建request和response

2、session的创建始于request.getSession(true);这里可以传false,即不创建新的

3、创建session的伪代码:

abbab78b9758440409dd056ecebd992c.png

这里create即传入的参数,false直接返回,如果是true的话

b11cddb555facc8306edf05c2a7f6cf5.png

当session创建成功后,直接往response里追加sessioncookie,

a16d4df6427bc1b6a3bd343c42e9a99d.png

这里追加的cookie,maxAge是通过

f968b1baffc74b7b61e17899ec118c8c.png

来设置的,默认没有时长,就是存储在浏览器内存的cookie,当窗口关闭后cookie就失效,这就是解释了在访问web容器的时候,cookie是什么时候生成的,对于tomcat来说,默认生成的是如下图所示的Cookie

ce8762ad53052b54b2cb1a28d1d1b84b.png

下面对web容器请求两次,都是http://localhost:8080/cookie

第一次:

16b03c312a4ffe057b64f8b1a2989293.png

首先容器生成session,往response里addHeader一个Set-Cookie,返会客户端

第二次请求

e2f59b213ae7feb2c2cfeec847f39e40.png

这个时候,浏览器内存已经得到第一次响应的Cookie,直接请求的时候,在request里面就带上cookie

cc2b56d43849ce2ffa9fd87a0bc4fae6.png

1因为参数中有HttpSession,所以会执行request.getSession(true);当然,直接在请求方法里之心这句也行

那么,对于存储在客户端的本地的cookie怎么设置呢,一样

ab8d71e8a91db55f26844b5e95835e65.png

这样的话,客户端本地就会持久化一个key=value的cookie,后续,在非失效的情况下,即使关掉窗口,请求时也会带有该cookie

修改后第一次请求

95920b2a2af230f4bdbcfc67f43bc058.png

第二次

3309c8f3d48114618c9010c564200228.png

关掉浏览器窗口后,在次请求

b4290abff181de6a9a89cab8b02b8175.png

那么,本来客户端如果禁用session怎么办,禁用的只是本地存储的session,上述例子就是key=value,对于内存的cookie不会影响,这就是web下的session-cookie机制

题外话:用户登录后,大多web容器是判断是否有session来判断用户,这就导致登录之前和之后的session不变的情况,这属于系统漏洞,web容器不会解决这个问题,这个问题放给别的框架或者系统自行解决

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

e6da6b14cc6d5776238c12ca0c5f4a46.pngf5cfb663166fc4827d2ba7a706fe648a.gif

● a8c2094e5c8a12276c6dc939e108cdd2.gif 谷歌开发者大会上,开源了一个超强项目ElasticDL

● a8c2094e5c8a12276c6dc939e108cdd2.gif 脚本之家粉丝福利,请查看!

● a8c2094e5c8a12276c6dc939e108cdd2.gif 那些裸辞的程序员,都干嘛去了?

● 致敬经典:Linux/UNIX必读书单推荐给你

● PYPL 9月语言排行榜,Python一枝独秀

58b88c393b45888ffa428dd6aea8ab05.gif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/559567
推荐阅读
相关标签
  

闽ICP备14008679号