HTTP协议定义的事务处理的四个步骤:
1、客户端和服务器建立连接;
2、客户端发送HTTP请求;
3、服务器端接收客户端发送的HTTP请求,生成HTTP响应后回发到客户端;
4、服务器关闭连接,客户端解析回发的响应,页面展示。
HTTP协议是无状态、无连接、遵循请求/响应模型的TCP/IP协议簇的成员。
那么这里就有一个问题,客户端与服务器建立的连接只针对一个请求/响应;因为无连接的缘故,web容器不能成功辨识来自同一个客户的第二次请求与第一次请求的请求发送者均为同一个客户;仅仅是从容器的角度考虑,每一次请求都来自于一个新客户;但在部分客户与服务器交互的web应用程序中需要服务器对请求跟踪以确定是否是同一个客户发送的请求(比如购物车、用户增删书籍的情况);所以web应用程序状态管理提出了一下四种技术手段来作为以上问题的解决方案:
1、表单隐藏字段:
在表单中添加隐藏字段<input type="hidden" name="test" value="testValue">;将一个input标签type属性改为hidden,该内容在表单提交时会将指定的name和value值包含在get或post数据中,该隐藏字段不会影响呈现给用户的页面外观。
隐藏字段的常见用途:对用户在网站上的访问进行会话跟踪;为服务器端程序提供预定义的输入;存储动态产生的页面的上下文信息。
隐藏字段的主要缺点:只有每个页面是都是动态生成的才有效,否则会断开会话状态跟踪!
2、Cookie:
将用户状态信息固定的保存在浏览器端;Cookie是是浏览器第一次访问服务器后由web服务器向客户端浏览器发送的简短文本信息,以后浏览器再访问同一个web服务器时浏览器会携带这些文本数据让服务器去读取以前发送到客户端的信息以达到用户状态跟踪;常见的应用场景:免密登录!
获得来自请求的Cookie数据:
Cookie [ ] cookies = request.getParameter("name");
Cookie对象的创建示例:
Cookie cookie = new Cookie("zhangsan","测试");
// 设置生命周期(以秒为单位)
cookie.setMaxAge(60);
// 添加 Cookie到响应头中,发送给客户端
response.addCookie(cookie);
Cookie失效:
Cookie的setMaxAge(time)方法设置Cookie的生命周期,time的单位是秒,过了这个时间Cookie将失效;time设定为负数表示该Cookie在浏览器关闭时过期;time为0则表示立刻删除该Cookie;关闭浏览器后,设置了默认过期时间的Cookie会在浏览器关闭后失效,设置了失效时间的Cookie会在设定失效的时间后失效,再次打开浏览器,失效的Cookie均不会向对应的服务器发送。
注意事项:
1、用户可能禁用Cookie,不要依赖于Cookie为站点添加功能,禁用后无效;
2、Cookie不要用于保存特别敏感的信息,比如密码。
3、URL重写:
部分用户可能会因为Cookie设计到隐私会在浏览器端禁用Cookie,这时候为了便于用户状态跟踪我们使用URL地址重写来解决;
原理:客户端浏览器将一些额外的数据以键值对的形式追加到标识会话的URL地址末尾,让服务器端程序去解析处理(该过程增加服务器压力),返回给用户的的URL都追加了额外的信息。
当Cookie被禁用时,SessionID就作为追加信息附到URL后面!即URL重写是会话跟踪的一条后路
4、Session会话跟踪:
该方案的技术基于Cookie或URL重写来实现;客户端浏览器第一次访问服务器时,服务器为客户端浏览器创建并维护一个Session对象用于存放数据,在创建Session对象的同时,服务器会为该Session对象创建一个唯一的编号SessionID,服务器以Cookie的形式将SessionID存放在客户端浏览器;客户端浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器通过该SessionID检索到以前的Session对象。
Session对象的创建:
// 获得HttpSession对象
HttpSession session = request.getSession();
// 设置Session最长不活动时间,单位是秒
session.setMaxInactiveInterval(50);
注意:存放在客户端浏览器中的SessionID的Cookie会在浏览器关闭时清除,即一个会话内sessionID有效(但可以利用Cookie的setMaxAge(time)方法设置Cookie生命周期来避免会话之后sessionID失效,即把Cookie的生命周期秒值设定尽可能大一些);Session对象的 setMaxInactiveInterval(time)方法用于设置最长不活动间隔,单位是秒,超过该时间的Session对象没有被存取,则该Session对象失效,time值为负数则表示该Session对象永不过期
会话:用户打开一个浏览器访问某个应用开始到关闭浏览器为止的交互过程称为一个“会话”!
会话超时管理:在一个web应用中,我们不希望Session对象不必要长时间保存时,但HTTP协议又没有相应机制来控制客户是否离开,这时候我们通过三种方式来销毁无用的会话:1、设置会话超时;2、在Session对象上调用invali()方法(手动调用该方法 ,Session对象立即销毁);3、应用结束(崩溃或取消部署);
一旦Session对象被销毁,所有绑定在该对象中的属性也会被解除!