状态管理概述
对容器而言,每一个请求都来自于一个新的客户
HTTP协议使用的是无状态的连接
四种方法来解决这个状态
表单隐藏字段
表单隐藏字段:
<input type="hidden" name="session" value=""/>
对用户在网站上的访问进行会话跟踪。
为服务器端程序提供预定义的输入。
存储动态产生的页面上下文信息。
隐藏字段主要的缺点
隐藏字段存在一个主要的缺点,即只有每当每个页面都是动态生成的时候才有效。
Cookie
表单是在生成动态时才有效,那么我们就使用HTTP Cookie来固定的保存在某个地方,需要是读取。
使用HTTP Cookie可以很好的维护和保留用户的状态信息,但是Cookie涉及到一些敏感的隐私问题,一些用户会禁用Cookie,
Session
这种高级接口建立在Cookie和URL重写之上
把客户的状态信息保存在服务器端
Session对象就是服务器为客户端创建并维护的用于存放客户状态数据的对象
URL重写
Cookie
Cookie原理
服务器在响应请求时将一些数据以“键-值”对的形式通过响应信息保存在客户端,当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端
例子
Cookie cookie = new Cookie("cool", "tiger!");
response.addCookie(cookie);
在Serlvet中管理Cookie
Servlet中提供了如下一系列操作Cookie的API
Cookie(name, value)
构造方法用于创建一个或多个Cookie
setMaxAge(int lifetime)
设置Cookie的过期时间(以秒为单位)。默认值为负值(Cookie将在浏览器关闭时过期
getMaxAge()
获取Cookie的过期时间。
getName()
获取Cookie的名字
setValue(String value)
指定Cookie的值。
getValue()
获取Cookie的值
在Servlet中使用Cookie
要将Cookie发送到客户端,Servlet应该按照下列的操作步骤执行
创建一个或多个Cookie,使用构造方法指定Cookie的名字和值
使用setXXX方法为Cookie设置属性值
使用HttpServletResponse对象的addCookie()方法将Cookie插入到响应头中
要读取客户端传入的Cookie,Servlet执行下列操作步骤
使用HttpServletRequest对象的getCookie方法返回一个Cookie对象数组
Servlet遍历该数组(调用getName()方法),直到找到与名称相匹配的Cookie值
Cookie工作流程
服务器
生成Cookie
把信息放在响应头中
响应给浏览器
浏览器
浏览器从响应头中取出Cookie信息
以文件形式保存电脑本地
Session
Session原理
服务器可以为客户端创建并维护一个Session对象,用于存放数据
在创建Session对象的同时,服务器将会为该 Session对象产生一个唯一编号,这个编号称之为SessionID
-服务器以Cookie的方式将SessionID存放在客户端
当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问
Session工作流程
服务器
创建Session对象
分配一个SessionId
发送保存SessionId的Cookie响应客户端
浏览器
再次请求,Cookie中携带了SessionID
容器根据SessionID找到相应对象
Session会话跟踪机制
用户发送请求
HttpSession session = request.getSession()
//getSession(false)方法使用已经存在的会话,而不必创建新会话
服务器的响应
再次发送请求
HttpSessoin接口
HttpSession接口常用的一些方法
setAttribute(java.lang.String, java.lang.Object)
在Session对象中用一个名字绑定一个对象
getAttribute(java.lang.String)
通过名字获取Session对象中保存的对象
removeAttribute(java.lang.String)
在Session中删除与一个名字对应的对象。
getCreationTime()
返回第一次创建会话的时间
getLastAccessedTime()
返回容器最后一次得到该会话ID的请求时间
setMaxInactiveInterval(int interval)
对于会话指定客户请求的最大间隔时间,以秒为单位。-1表示永不过期
getMaxInactiveInterval(int interval)
返回客户请求的最大间隔时间
invalidate()
会话结束,当前存在在会话中的所有会话属性也会解除绑定
getId()
此方法返回每个session唯一的标识
会话超时管理
销毁会话可以采用如下三种简单的方式
设置会话超时
在Session对象上调用invalidate()方法
应用结束(崩溃或取消部署)
//浏览器关闭时并不意味着Session对象被删除