状态跟踪:
http协议是一种无状态的协议,当请求和响应完成后会断开连接,以释放服务器内存资源。所以服务器无法保存客户端的状态,服务器会认为每次请求的客户端都是新用户。但是很多时候我们需要得到客户端的状态,完成一系列的上午活动,这时就需要状态跟踪
状态跟踪由四中解决方案:
- 隐藏表单hidden
- Cookie:
- 流程:客户端访问服务器,服务器调用response.addcookie()方法。产生响应时,会产生set-cookie响应头,将cookie文本发给客户端,客户端会将cookie文本保存起来。当客户端在次请求服务器时,会产生cookie请求头,将之前服务器发送的消息,在发送给服务器。服务器就可以根据cookie信息跟踪客户端状态
- 分类:
- 存放在客户端浏览器的缓存中。浏览器不关闭,cookie信息一直存在,浏览器一旦关闭cookie消失
- 存放在客户端的文件中,并可以设置cookie的过期时间。有效时间之类,即使浏览器关闭,也可以将cookie信息发送给服务器。超过有效时间,cookie消失
- Cookie信息是以文本方式存放于客户端的,容易引起一些安全隐患,所以不要把隐秘信息以cookie方式保存
- Session
- 流程:客户端访问服务器,服务器产生调用request.getsession()产生session对象。用于跟踪用户的状态。同时,给session对象分配一个唯一标识。为了管理session对象,所以以sessionId为键,以session对象为值,封装为map集合;产生响应时,将sessionID以cookie方式发送给客户端,客户端存放在客户端浏览器的缓存中。当客户端再次请求服务器,会将sessionID以cookie请求头的方式发送给服务器。服务器得到sessionID后,从map集合中得到session对象,从而跟踪状态;一个客户端只有一个session
- 常见方法:
- Session时服务器端用于保存客户端相关状态对象。由于http协议是无状态协议,所以客户端是否关闭浏览器,服务器并不知道。这就是意味着,客户端即使关闭浏览器下线,服务器也会一直保持session对象。这样会极大的耗费服务器的内存资源。所以服务器应该即使清理过时的session,以释放服务器的内存资源
- Session的销毁方式有三种:
- 设置超时时间
- 调用session对象的invalidate(),强行关闭
- 应用服务器崩溃
- URL重写
- 当客户端禁用了cookie后,服务器发送给客户端的sessionID,客户端就不能通过cookie方式进行保存。那么客户端请求时,也不能将sessionID,以cookie的请求头方式提交给服务器。服务器得不到sessionID,也就无法取出session对象,从而不能跟踪状态。
- 解决方案:在URL后面,强行附加sessionID<a href ="lovobook/writeURL;jsessionid=…….>click</a>这样,客户端无论是否禁用cookie,服务器都可以得到sessionID,从而跟踪状态。