更容易理解cookie和session

浏览器从开启 到 关闭,我们称为一次会话

  • session的生命周期:服务器非正常关闭、超过30分钟未访问session对象、调用invalidate()方法都会销毁,服务器正常关闭,则会保存在硬盘上,下次服务器启动时会加载回来,一个会话只有一个session,也就是说,只要服务器那边不是非正常关闭,服务器中的sessionid30分钟内不调用是不会消失,在cookie中设置setMaxAge(int expiry)即可。
  • cookie生命周期:和浏览器的关闭与否有关,和服务器关闭与否无关
    0 让cookie立即销毁
    -1 默认 浏览器必须打开着的,浏览器关闭cookie销毁

0的正整数 0

          只要正整数大于0的,就会存活在浏览器对应的硬盘上,不以浏览器的关闭为销毁。
           而是时间到期,就会自动销毁

相同的cookie设置,新的会覆盖旧的

  • 用户第一次登录服务器后,服务器会返回一些数据(cookie)给浏览器,浏览器保存在本地或者内存,用户第二次访问服务器的时候,服务器就会根据用户上次保存的cookie来判断是哪个用户。
  • 当会话开启并且创建session的时候,就会生成一个sessionID,并且服务器把这个ID返回给浏览器以cookie保存,在服务器中,不但会保存SessionID,而且还会保存其产生的用户信息,这样一来,用户下次访问服务器,通过cookie值的sessionID就可以判断其身份,进而获取这个用户上次记录的信息。
  • 关闭会话之后,当我们重新打开浏览器窗口时,之前的Cookie中存放的Sessionid已经不存在了,此时服务器从HttpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上原先的session等到它的默认时间到之后,便会自动销毁。
    但是如果我把浏览器关闭了呢?这样的话,我该如何再次访问相应的session呢?
  • 首先,服务器中session的声明周期是可以自己来设置的,默认的是30分钟,那么当我们关闭浏览器之后,浏览器中的cookie消失了,但这个服务器中的session其实还没有消亡,(如果我们需要它消亡的话,我们可以调用invalidate方法,这也是网站中的安全退出常见操作之一)。
  • 既然没有消亡,为什么关闭浏览器之后,我们就访问不到了呢?那是因为cookie中的JSESSIONID信息没有了,不会自动携带这个session信息了,服务器找不到对应的session,就会自动添加新的session,这个新添加的session显然不是我们需要的。所以,我们就可以利用cookie来实现这个需求。
  • 只要我们手动为cookie中添加JSESSIONID信息,那么不管你的浏览器是否关闭,我的cookie中都会携带JSESSION信息,这样的话,服务器就一定能够找到对应的session,而不会重新建立一个新的session,这样只要session没有消亡,就一定可以访问到对应的session。

session和cookie的应用场景

session:
除非是纯静态的页面,否则都会用到session来记录用户的行为。

cookie典型应用场景:
1.判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。而修改账户密码等操作也需要对其登陆状态进行判断,常用于登录和保存用户最近浏览商品。

2.另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。

如何实现session的共享?
  首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。
  事实上,各种web框架早已考虑到这个问题,比如asp.NET,是支持通过配置文件修改session的存储介质为sql server的,所有机器的会话数据都从同一个数据库读,就不会存在不一致的问题;php支持把会话数据存储到某台memcache服务器,你也可以手工把session文件存放的目录改为nfs网络文件系统,从而实现文件的跨机器共享。
  还有一个简单的办法可以用于会话信息不会频繁变更的情况,在机器a设置用户会话的时候,把会话数据post到机器b的一个cgi,机器b的cgi把会话数据存下来,这样机器a和b都会有同一份session数据的拷贝。

**

最后上图:在这里插入图片描述

**

猜你喜欢

转载自blog.csdn.net/weixin_44704605/article/details/120641011
今日推荐