Web状态管理概述
HTTP协议使用的是无状态的连接
对容器而言,每一个请求都来自于一个新的客户
状态管理解决方案-隐藏字段
表单隐藏字段
<input type=”hidden” name=”session” value=”...”>
1:对用户在网站上的访问进行会话跟踪。
2:为服务器端程序提供预定义的输入。
3:存储动态产生的页面上下文信息。
状态管理解决方案-Cookie
把客户的状态信息保存在客户端浏览器
状态管理解决方案-Session
把客户的状态信息保存在服务器端
Session对象就是服务器为客户端创建并维护的用于存放客户状态数据的对象
状态管理解决方案-URL重写
用户禁用Cookie使用URL地址重写来解决 (把ID附加在URL地址后面 )
Cookie原理
服务器在响应请求时将一些数据以“键-值”对的形式通过响应信息保存在客户端
在Serlvet中管理Cookies
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的名字和值
使用setValue方法为Cookie设置属性值
使用HttpServletResponse对象的addCookie()方法将Cookie插入到响应头中
要读取客户端传入的Cookie,Servlet执行下列操作步骤:
使用HttpServletRequest对象的getCookies方法返回一个Cookie对象数组
Servlet遍历该数组(调用getName()方法),直到找到与名称相匹配的Cookie值
Session原理
服务器可以为客户端创建并维护一个Session对象,用于存放数据。
在创建Session对象的同时,服务器将会为该 Session对象产生一个唯一编号,这个编号称之为SessionID
服务器以Cookie的方式将SessionID存放在客户端。
当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,
服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问.
Session会话跟踪机制
用户发送请求
HttpSession session = request.getSession();
服务器的响应如下
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=3453597CE6EA6B4F948C09D67530F2C0;
Path=/lovobook
Content-Type: text/html;charset=utf-8
再次发送请求
Cookie: JSESSIONID=3453597CE6EA6B4F948C09D67530F2C0
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对象被删除)
应用结束(崩溃或取消部署)
在web.xml文件中配置
<session-config>
<session-timeout>15</session-timeout>
</session-config>
是以分钟为单位
Application与Session域范围的属性比较
在web应用上下文域范围和Session域范围中,都可以用一个名字来绑定一个对象,从而在域范围内进行访问
绑定在Session范围内的对象仅仅在一个持续的会话期间被维护
绑定在Application(应用上下文)中的对象,在整个Web应用程序运行过程中都被维护。
都使用相同的方法:
setAttribute()
getAttribute()
Session持久化管理
Session对象在持久化时,存放在其中的对象以序列化的形式存放
URL重写
Session对象的正常使用要依赖于Cookie
URL地址重写能够取得置于Cookie中的会话,并把会话ID附加到访问应用的各个URL最后
URL重写方法:
response.encodeURL()
response.encodeRedirectURL(“/webText/sucess.html” )
URL重写是容器自动完成的,但需要我们对URL进行编码才有效
URL重写的实现
HTTP/1.1 200 OK
……
Set-Cookie: JSESSIONID=F7A5D5B85C8036D46371D7D3B1E9D2D6; Path=/lovobook
……
<html><body>
<a href="/webText/WriteURL;jsessionid=F7A5D5B85C8036D46371D7D3B1E9D2D6> Click</a>
</body></html>
如果禁用Cookie,容器会同时尝试Cookie和URL重写这两种方法
GET
/webText/WriteURL;jsessionid=F7A5D5B85C8036D46371D7D3B1E9D2D6 HTTP/1.1
HTTP协议使用的是无状态的连接,连接只针对一个请求/响应
状态管理方案:表单隐藏字段、Cookie、Session、URL重写
Cookie是Web服务器发送到客户端浏览器并保存的简短文本信息
Session对象就是服务器为客户端创建并维护的用于存放客户状态数据的对象
用户会禁用Cookie。这时我们可以使用URL地址重写来解决
通过HttpServletResponse的addCookie方法将该Cookie信息添加到响应信息中
Session对象是某个Servlet调用HttpServletRequest.getSession()这样的语句时才被创建
Session对象是保存在服务器端,浏览器关闭时并不意味着Session对象被删除
Session只认SessionID不认人
应当尽量使用维护时间短的域对象
在向客户返回第一个响应时,会同时尝试设置Cookie和URL重写两种做法