先说Session吧,由于HTTP协议是一种无状态协议,服务器单从网络连接上无从知道客户身份。用户A购买了一件商品放入购物车内,当再次到其他商品页购买商品时服务器已经无法判断该购买行为是属于用户A的还是其他用户的,即Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。那怎么办呢?
想办法给每个用户颁发一个专属通行证吧,事实上每个用户第一次访问服务器都会建立一个session(会话),用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。短期内同一个用户访问网页时会带着自己的SessionId,这样服务器就能根据SessionId来认出当前用户是哪个用户。我们把这种基于唯一ID识别用户身份的机制称为Session。如果用户在一段时间内没有访问服务器,那么Session会自动失效,下次即使带着上次分配的Session ID访问,服务器也认为这是一个新用户,会分配新的Session ID。一次Session会话中往往包含着若干次request请求。
那么问题来了,我们每次请求时是依靠什么把SessionId自动带到服务器的呢?答案就是Cookie,你可以理解为Cookie是一个容器,里面存放了你浏览网页时做出的一些选择,输过的文字信息,登陆过的账号密码,以及自己的过期时间,路径和域等一小段文本信息(长度有限制,比如在Chrome浏览器中,单个 Cookie的长度不能超过 4069 个字符),第一次访问时服务器将SessionId以Cookie的形式响应发送到浏览器,浏览器在后续请求访问时总是附带此Cookie,这样,服务器就可以识别用户身份。Servlet提供的HttpSession本质上就是通过一个名为JSESSIONID的Cookie来跟踪用户会话的。储存需要的信息。服务器通过SessionId作为key,读写到对应的value,这就达到了保持会话信息的目的。
总结:cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上。单个cookie保存的数据不能超过4K,读取Cookie主要依靠遍历HttpServletRequest附带的所有Cookie。