1,状态管理
(1)什么是状态管理
将浏览器与web服务器之间多次交互当做一个
整体来看待,并且将多次交互所涉及的数据(即状态)
保存下来。
状态管理要解决两个问题:
a,身份的识别
b,状态的保存和维护
(2)如何进行状态管理
a,客户端的状态管理方案
即将状态保存在客户端(通常是浏览器),
比如cookie技术。
b,服务器端的状态管理方案
即将状态保存在web服务器端,比如
session(会话)技术
(3)cookie技术
1)cookie是什么?
服务器临时保存在浏览器端的少量的数据。
2)cookie是如何工作的?
当浏览器访问服务器时,服务器会将少量的
数据以set-cookie消息头的方式发送给浏览器,
浏览器会将这些数据临时保存下来;当浏览器
再次访问服务器时,会将之前保存的数据以
cookie消息头的方式发送给服务器。
3)如何添加cookie?
Cookie c = new Cookie(String name,String value);
response.addCookie©;
4)查看cookie?
Cookie[] request.getCookies();
注意:有可能返回null。
String cookie.getName();
String cookie.getValue();
5)cookie的编码问题
cookie只能保存合法的ascii字符,如果要保存
非ascii字符,比如中文,需要将中文转换成相应的
ascii字符的表示形式。
String URLEncoder.encode(
String str,String charset);
String URLDecoder.decode(
String str,String charset);
建议保存cookie时,最好都使用以上方法编码。
6)cookie的生存时间
如果添加cookie时,没有设置cookie的生存时间,
则浏览器会将cookie保存在内存里面,只要浏览器
不关闭,则cookie一直存在,如果浏览器关闭,则
cookie会被删除。
cookie.setMaxAge(int seconds);
注:
a,单位是秒
b,seconds的值可以是以下三种情况:
大于0: 浏览器一般会将cookie保存在硬盘上,
当超过指定的时间,浏览器会删除该cookie。
小于0:缺省值
等于0:删除cookie
比如,要删除一个名称为"uid"的cookie
Cookie c = new Cookie(“uid”,"");
c.setMaxAge(0);
response.addCookie©;
练习:
写一个Find_addCookieServlet,该servlet
会先查看有没有一个名称为"uid"的cookie,如果
有,则显示该cookie的值;如果没有,则添加。
不用考虑编码问题和生存时间问题。
7)cookie的路径问题
浏览器向服务器上的某个地址发请求时,会
比较要访问的地址是否与cookie的地址(即路径)
匹配,只有匹配的cookie才会发送。
a,cookie的默认的路径
等于添加该cookie的组件的路径。
比如 "/web06/biz01/"的addCookie.jsp
添加了一个cookie,则该cookie的路径就等于
"/web06/biz01/"。
b,匹配规则
/web06/ findCookie1.jsp error
/web06/biz01/ findCookie2.jsp ok
/web06/biz01/abc/ findCookie3.jsp ok
要访问的路径必须是cookie的路径或者其子路径,
cookie才会被发送。
c,设置cookie的路径
cookie.setPath(String path);
比如,cookie.setPath("/web06");
8)cookie的限制
a,不安全,如果有敏感数据必须以cookie的方式
来保存,必须加密。
b,可以被用户禁止。
c,cookie只能保存少量的数据(4k)。
d,浏览器能够保存cookie的数量也有限制
(大约300个左右)。
e,只能保存字符串。
2,session(会话)
(1)session是什么?
服务器为客户端创建的一个用来维护状态的对象。
(2)session的工作原理
浏览器访问服务器时,服务器创建一个session
对象(该对象有一个唯一的id,一般称之为sessionId),
,服务器会将sessionId以cookie的方式发送给浏览器,
当浏览器再次访问服务器时,会将sessionId发送
给服务器,服务器可以依据sessionId找到之前创建的
session对象。
(3)如何获得session对象?
1)方式一
HttpSession s =
request.getSession(boolean flag);
当flag = true时
查看请求当中是否有sessionId,如果没有,
则创建一个session对象。如果有sessionId,
依据该sessionId查找对应的session对象,如果
找到了,则返回,如果找不到,则创建一个
新的session对象。
当flag = false时
查看请求当中是否有sessionId,如果没有,
返回null,如果有sessionId,依据该sessionId
查找对应的session对象,如果找到了,则返回,
如果找不到,返回null。
2)方式二
HttpSession s =
request.getSession();
等价于 request.getSession(true)。
(4)绑订数据相关的几个方法
//绑订数据到session对象上。
setAttribute(String name,Objec value);
//依据绑订名找到绑订值。该方法有可能返回null。
Object getAttribute(String name);
//解除绑订
removeAttribute(String name);