# 1.状态管理
## (1)什么是状态管理?
将浏览器与web服务器之间多次交互当作一个整体来处理,并且将
多次交互所涉及的数据(即状态)保存下来。
## (2)如何进行状态管理?
方式一: 将状态保存在浏览器端(Cookie)。
方式二: 将状态保存在服务器端(Session)。
## (3)Cookie
### 1)什么是Cookie?
服务器临时存放在浏览器端的少量数据,用于跟踪用户的状态。
注:
当浏览器第一次访问服务器时,服务器可以将少量数据
以set-cookie消息头的形式发送给浏览器,浏览器会将这些
数据临时保存下来。
当浏览器再次访问服务器时,会将这些数据以cookie消息头
的形式发送给服务器。
### 2)添加Cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
### 3)读取Cookie
Cookie[] request.getCookies();
注:
该方法有可能返回null。
String cookie.getName();
String cookie.getValue();
### 4)Cookie的生存时间
默认情况下,浏览器会将cookie保存在内存里面,浏览器如果关闭,则
cookie会被删除。可以调用setMaxAge方法来设置cookie的生存时间。
cookie.setMaxAge(int seconds);
注: 单位是秒。seconds > 0: 浏览器会将cookie保存在硬盘上。超过指定的时间,cookie会被删除(失效)。seconds < 0: 默认情况(将cookie保存在内存里面)。seconds = 0: 删除cookie。比如,要删除一个名称为"username"的cookie:
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
### 5)cookie的编码问题
a.什么是cookie的编码问题?
cookie只能存放合法的ascii字符,对于非ascii字符(比如中文)
需要转换成对应的ascii字符的形式。
b.如何解决?
添加cookie时,使用encode方法对要添加的字符串进行编码,
读取cookie时,使用decode方法来解码。
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
建议:
在添加cookie时,不管是否是ascii字符,
统一使用encode方法来编码。
### 6)Cookie的路径问题
a.什么是cookie的路径问题?
浏览器在访问服务器时,会比较请求路径是否与cookie的路径匹配,只有匹配条件的cookie才会被发送出去。
b.cookie默认路径
cookie的默认路径等于添加该cookie的web组件的路径。 比如,/servlet07/biz01/addCookie.jsp添加了一个cookie,则该cookie 默认路径就是"/servlet07/biz01"
c.匹配规则
请求路径要么等于cookie的路径,要么是cookie的子路径,该cookie才会被发送。 比如,cookie的路径是"/servlet07/biz01",则:
请求地址是/servlet07/findCookie1.jsp,则cookie不会被发送;请求地址是/servlet07/biz01/findCookie2.jsp,会发送;请求地址 是/servlet07/biz01/sub/findCookie3.jsp,会发送。
d.如何修改cookie的路径?
cookie.setPath(String path);
### 7)Cookie的限制
a.Cookie可以被用户禁止。
注:可以提示用户不要将cookie禁止。
可以通过navigator.cookieEnabled来获得浏览器是否禁止了cookie。
b.Cookie只能存放少量的数据。
大约4k左右。
c.Cookie数量也有限制。
几百个左右。
d.Cookie只能存放字符串。
e.Cookie不安全。
敏感数据尽量不要直接以cookie的方式保存。
如果一定要用,要加密处理。