上一篇介绍了session和cookie的产生,以及cookie是什么,本篇继续学习。
session |
session的创建
当程序需要为一个用户创建session时,服务器首先检查这个客户端的请求里是否包含sessionId,如果已经包含则说明已经为此客户端创建过session,服务器将通过这个sessionId检索出相应的session。如果客户端请求不包含sessionId,则为客户创建一个session并生产一个与之关联的sessionId,sessionId的值是一个既不会重复,又不容易被找到规律以仿造的字符串。session的失效
session是存放在服务器端的,可以设置其过期时间,sessionId是存放在cookie中,一般默认为临时对话,在浏览器关闭该session就会失效。cookie禁用
如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie。- URL重写,把sessionId直接附加在URL路径后面,通过URL来传递sessionId,服务端接受到之后来分析获取sessionId。
- 表单隐藏字段。服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionId传递回服务器。
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
session共享
对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间sessionId的共享。由于域名不同,而sessionId又分别存储在各自的cookie中,因此服务器会认为对于两个子站的访问,是来自不同的对话。方法:通过修改cookies的域名为父域名达到cookie共享目的,从而实现sessionId共享。
session共享的机制在使用redis时也有体现,当使用分布式部署项目时,这时就出现了服务器集群,这时该如何保证用户登录的时候无论使用哪一个服务器都可以保证验证成功呢?这一部分现在还不太确定是否正确,大家自行验证了。但大体上是有两种思路可以实现的:①使用redis拦截器统一一个入口。②服务器主从复制。
参考资料
https://www.cnblogs.com/wxinyu/p/9154178.html
https://blog.csdn.net/bwh0520/article/details/78808181
https://blog.csdn.net/ToBeTheEnder/article/details/52485948
https://blog.csdn.net/h19910518/article/details/79348051
https://www.cnblogs.com/endlessdream/p/4699273.html
https://blog.csdn.net/weixin_35804181/article/details/79643525