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);
注:
    name:Cookie名,每一个cookie都必须有一个名字,要求唯一。
    value:Cookie值。

3)如何读取浏览器端发送过来的Cookie?

Cookie[] request.getCookies();
注:
    该方法有可能返回null。
String cookie.getName();
String cookie.getValue();

4)Cookie的生存时间

Cookie.setMaxAge(int seconds);

单位是秒。
    值可以>0: 浏览器会将cookie保存在硬盘上(一般是一个小的文件),
        超过指定时间,cookie会被删除(失效)。
    值可以<0: (缺省值),即浏览器会将cookie保存在内存里面,浏览器如果
        关闭,则cookie会被删除。
    值可以=0: 删除cookie。
        比如,要删除一个名称为"username"的cookie
        Cookie c = new Cookie("username","");
        c.setMaxAge(0);
        response.addCookie(c);

5)Cookie的编码问题

a.什么是Cookie的编码问题?

Cookie里面只能存放合法的ascii字符,对于非ascii字符,比如中文,
要将中文转换成合法的ascii字符的形式。

b.如何处理?

String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);

c.建议: 添加cookie时,最好统一编码处理。

6)Cookie的路径问题

a.什么是Cookie的路径问题?

浏览器向服务器发请求时,会查看请求地址是否符合Cookie的路径要求,
只有符合条件的cookie才会被发送。

b.Cookie的默认路径

等于添加該Cookie的web组件的路径。
比如说 "/servlet09/biz01/addCookie.jsp"添加了一个cookie,
则该cookie的默认路径就是"/servlet09/biz01"。

c.匹配规则

请求地址要么等于cookie的路径,要么是其子路径。只有符合
这个条件的cookie才会被发送。

比如说,cookie路径是"/servlet09/biz01",
请求地址是 "/servlet09/findCookie1.jsp",       no!
请求地址是 "/servlet09/biz01/findCookie2.jsp",   yes!
请求地址是"/servlet09/biz01/sub/findCookie3.jsp", yes!

d.修改Cookie的路径

cookie.setPath(String path);

7)Cookie的限制

a.Cookie可以被用户禁止。

注:可以提示用户不要将cookie禁止。
    可以通过navigator.cookieEnabled来获得浏览器是否禁止了cookie。

b.Cookie只能存放少量的数据。

大约4k左右。

c.Cookie数量也有限制。

几百个左右。

d.Cookie只能存放字符串。

e.Cookie不安全。

敏感数据尽量不要直接以cookie的方式保存。
如果一定要用,要加密处理。

(4)Session(会话)

1)什么是Session?

服务器为了保存用户状态而创建的一个特殊的对象。

当浏览器第一次访问服务器时,服务器创建一个session对象(该
对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId
以cookie的方式发送给浏览器。
当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据
sessionId就可以找到对应的session对象。

2)如何获得session对象?

方式一 HttpSession s = request.getSession(boolean flag);

    注:
        HttpSession是一个接口。
        当flag为true时:
                    先查看请求当中是否有sessionId,如果没有,
                则创建一个session对象。如果有,则依据sessionId
                查找对应的session对象,如果找到了,则返回该
                对象,如果找不到,创建一个新的session对象。
        当flag为false时:
                    先查找请求当中是否有sessionId,如果没有,
                返回null。如果有,则依据sessionId查找对应的session
                对象,如果找到了,则返回该对象,如果找不到,返回
                null。

方式二 HttpSession s = request.getSession();

等价于  request.getSession(true);  

3)常用方法

绑订数据:

    session.setAttribute(String name,Object obj);

依据绑订名获得绑订值:

    Object session.getAttribute(String name);
    注:如果绑订名对应的值不存在,返回null。

解除绑订:

    session.removeAttribute(String name);

练习

写一个Servlet,添加一个名称为"company"的cookie,值是"tarena"。