状态管理--Cookie

状态管理
1) 什么是状态管理
- 将浏览器与web服务器之间多次交互当作一个整体来看待,并且将多次交互涉及到的数据(即状态)保存下来.

2) 如何进行状态管理?
- 将状态保存在浏览器端(Cookie)
- 将状态保存在服务器端(Session)

3) Cookie

状态管理--Cookie

(1)什么是Cookie?
- 服务器临时存在浏览器端的少量数据,用于跟踪用户的状态

(2) Cookie的工作原理
- 当浏览器访问服务器时,服务器会将少量数据以`set-cookie`消息头的方式发送给浏览器,浏览器会将这些数据临时保存下来,当浏览器再次访问服务器时,会将这些数据以`cookie`消息头的方式发送给服务器.

(3) Cookie的添加(服务器将cookie发送给浏览器,response响应对象的方法)
 

    Cookie cookie = new Cookie(String name , String value);//name:value只能存放字符串,名字:值;
    response.addCookie(cookie);//将Cookie对象作为参数


(4) Cookie的获取(request请求对象的方法)
    

    Cookie[] cookies = request.getCookies();
    //首先进行判断,不为空的时候才可以进行遍历操作,因为可能一个Cookie也没有
    String name = cookie.getName();
    String value = cookie.getValue();

 (5) Cookie的生存时间    
- 默认情况下,浏览器会将Cookie保存在内存中,浏览器关闭,则Cookie会被删除.
 

        cookie.setMaxAge(int seconds);
        注:    
            a:单位是s;
            b:当seconds>0,浏览器将Cookie保存在硬盘上,当超时,cookie删除
              当seconds<0,浏览器会将Cookie保存在内存中,缺省值
              当seconds=0,浏览器会立即删除cookie;
                SUN公司提供的Cookie的API中没有提供直接删除cookie的方法
                    比如:要删除一个名称为"username"的cookie:
                    Cookie c = new Cookie("username","");
                    c.setMaxAge(0);
                    response.setCookie(c);    


                   
状态管理--Cookie

练习:
- 写一个Servlet,该Servlet先查看有没有一个名称为"cart"的Cookie,如果有,则显示该Cookie的值,如果没有,则添加该Cookie
        

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            boolean flag = false;
            for(Cookie cookie : cookies){
                String name = cookie.getName();
                if("cart".equals(name)){
                    String value = cookie.getValue();
                    out.println("<h2>已经存在名为cart的Cookie:"+value + "</h2>");
                    flag = true;
                }
            }
            if(!flag){
                Cookie newCookie = new Cookie("cart", "123");
                response.addCookie(newCookie);
                out.println("<h1>已经添加名为cart的Cookie</h1>");
            }
        }else{
            Cookie newCookie = new Cookie("cart", "123");
            response.addCookie(newCookie);
            out.println("<h1>已经添加名为cart的Cookie</h1>");
        }

(6) Cookie的编码问题
- 什么是Cookie的编码问题?

    Cookie只能存放合法的ASCII码字符,中文需要转换成合法的ASCII码字符形式才能存放!(Tomcat高本版已经经过处理)

状态管理--Cookie

    设置Cookie的时候URL编码
    
       

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


    读取Cookie的时候URL解码
    
       

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


建议:不管是否为中文,最好统一进行编码,避免不合法的ASCII码字符
    
(7) Cookie的路径问题
- 什么是Cookie的路径

    浏览器访问服务器会比较请求地址是否与Cookie的路径匹配,只有匹配的Cookie才会被发送出去.

- Cooki的默认路径

    Cookie的默认路径 = 添加该Cookie的组件(Servlet/JSP)路径
        
        比如:/day06/biz01/addCookie.jsp添加了一个cookie,则该cookie的路径为/day06/biz01

状态管理--Cookie
    
匹配规则:请求路径(地址)必须等于Cookie的路径或者是Cookie的子路径
    比如,cookie的路径是"/day06/biz01",则访问如下地址

        /day06/findCookie1.jsp  no
        /day06/biz01/findCookie2.jsp yes
        /day06/biz01/sub/findCookie3.jsp yes

状态管理--Cookie

- 修改Cookie的路径

 cookie.setPath(String path);//缺省路径为web组件所在路径