状态管理——Cookie

来源:互联网 发布:python教学 编辑:程序博客网 时间:2024/06/16 23:50

状态管理

(1)什么是状态管理

      将浏览器与web服务器之间多次交互当做一个整体来看待,并且將多次交互所涉及的数据保存下来 

(2)Cookie

   1)什么是Cookie?  


        服务器临时保存在浏览器端的少量的数据

    2)cookie的工作原理

         浏览器访问服务器时, 服务器会将少量数据以set-cookie消息头的方式发给浏览器,浏览器会将这些数据临时保存起来;当浏览器再次访问服务器时,会将之前保存的这些数据以cookie消息头的方式发送给服务器。  

    3)添加cookie  

       Cookie cook=new Cookie(String name,String value);//创建cook  
       //cookie.setMaxAge();  
       Response.addCookie(cook);//添加cookie  

    4)读取cookie  

      Cookie [] cook=request.getCookies();//注意该方法可能返回null  
      String name=cookie.getName();  
      String value=cookie.getValue();

    5)编码问题  

     Cookie只能保存合法的ASCII字符,对于中文,需要将其转换成相应的ASCII字符的表现形式。
         URLEncoder.encode();//将中文设置成相应的ASCII  
         URLDecoder.decode();//将相应的ASCII码转换为中文
     注意:添加cookie时建议最好统一编码处理

    6)生存时间 

     Cookie.setMaxAge(int seconds)  
    默认浏览器会将cookie保存在内存里面。浏览器只要不关闭,cookie就一直存在,浏览器关闭,则cookie会被删除。

    注意:  
      a.单位为秒  
      b.当seconds>0 浏览器会将cookie保存在硬盘上,当超过指定时间,浏览器会删除该cookie  
         当seconds<0 (缺省值)  
         当seconds=0 删除cookie  
         比如,要删除一个名称为“uid”的cookie:  
                 Cookie c=new Cookie(“uid”,””);  
                 c.setMaxAge(0);  
                 response.addCookie(c);

    7)路径问题  

      a.什么是cookie的路径问题?  
            浏览器在向服务器上的某个地址发送请求时,会比较该地址是否符合cookie路径的描述,只有符合要求的cookie才会被发送。  
      b.cookie默认路径  
            Cookie有一个默认路径,等于添加该cookie组件的路径。比如:/T-Test5/bz1/cookie1.jsp,则添加的cookie的路径就等于/T-Test5/bz1/  
      c.要访问的地址必须是cookie的路径或者其子路径  
      d.cookie.setPath(String path)  
              比如:cookie.setPath(“/T-Test5”) 

      注意:
          * Cookie的path并不是设置这个Cookie在客户端的保存路径!!  
          * Cookie的path由服务器创建Cookie时设置  
          * 当浏览器访问服务器某个路径时,需要归还哪些Cookie给服务器呢?这由Cookie的path决定。  
           浏览器访问服务器的路径,如果包含某个Cookie的路径,那么就会归还这个Cookie。  
          * 例如:  
                     aCookie.path=/day11_1/; bCookie.path=/day11_1/jsps/; cCookie.path=/day11_1/jsps/cookie/;  
                            访问:/day11_1/index.jsp时,归还:aCookie  
                            访问:/day11_1/jsps/a.jsp时,归还:aCookie、bCookie  
                            访问:/day11_1/jsps/cookie/b.jsp时,归还:aCookie、bCookie、cCookie  
     

       Cookie的path默认值:当前访问路径的父路径。例如在访问/day11_1/jsps/a.jsp时,响应的cookie,那么这个cookie的默认path为/day11_1/jsps/

    8)cookie的限制  

       a.cookie可以被禁止。
       b.cookie不安全,对于敏感数据,尽量不要以cookie的方式保存。
       c.cookie的大小有限制(大约4k左右)。
       d.cookie的数量也有限制(大约300个)。
       e.cookie只能保存字符串。 

练习:获取用户上次登录时间
分析:  
         写一个Find_AddCookieServlet,该Servlet会先查询有没有一个名称为"uid"的cookie, 如果有,则显示该cookie的值;如果没有, 则添加之。cookie的值是当前系统时间  
注:不用考虑生存时间
代码:

public class  Find  extends HttpServlet{     public void service(HttpServletRequest req,HttpServletResponse resp)throw ServletException,IOException{PrintWriter pw = resp.getWriter();String time = getTime();Cookie cook1=null;cook1=new Cookie("uid",time);if("/T-Test5/find.do".equals(uri)){Cookie[] cooks=req.getCookies();boolean tag=false;if(cooks!=null){for (Cookie cookie : cooks){if(cookie.getName().equals("uid")){pw.println("你上次登录的时间为:"+cookie.getValue()+"<br>");tag=true;//有,覆盖resp.addCookie(cook1);pw.println("你本次登录的时间为:"+cook1.getValue());}  }if(!tag){    //无,添加resp.addCookie(cook1);pw.print("欢迎新用户");}}else{//空,添加resp.addCookie(cook1);pw.print("新用户");}}protected String getTime() {Date date=new Date();SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");String time=sdf.format(date);return time;}


  (3)Cookie的用途 

    *服务器使用Cookie来跟踪客户端状态!  
    *保存购物车(购物车中的商品不能使用request保存,因为它是一个用户向服务器发送的多个请求信息)  
    *显示上次登录名(也是一个用户多个请求)  

     Cookie是不能跨浏览器的! 


  (4)JavaWeb中使用Cookie

     *原始方式(了解):  
        使用response发送Set-Cookie响应头  
         使用request获取Cookie请求头 
    *便捷方式(精通):  
         使用repsonse.addCookie()//方法向浏览器保存Cookie  
         使用request.getCookies()//方法获取浏览器归还的Cookie

原创粉丝点击