Cookie学习

来源:互联网 发布:电视软件市场 编辑:程序博客网 时间:2024/06/10 22:00

本篇博客简单学习Cookie
主要内容:
1.cooike的作用
2.cookie的简介
3.Cookie类的简单使用
4.cookie实例—查看用户上次登录时间
5.cookie实例—查看用户最近图片浏览记录。
6.在前端写cookies

cookie—浏览器的小饼干~用Cookie来传递用于跟踪客户状态的数据。
将信息保存到客户端。
cookie的作用:附带在浏览器上面,服务器可以设置和读取上面的信息。 比如:用来查看最近浏览记录、上次登陆时间等等。
典型的例子:某东通过你在京东商城的浏览商品记录,当你用同一个浏览器的访问新浪首页的时候,他给你推荐商品—恰恰是你最近在京东浏览的同类商品。

Cookie-简介:

 - Cookie,是客户端在访问web服务器时,服务器在客户端的机器上存放的信息。 - 服务器将Cookie保存在客户机器上的原因是为了跟踪客户的状态。这主要用于特殊的场合如电子商务。 - JavaServletApiCookie提供了简单实现,javax.servlet.http.Cookie类表示Cookie - Cookie保存客户端的硬盘上,通过key和value值来保存信息,类似于MapCookie的key和value不能使用中文。如果要保存中文,必须使进行编码。 - 切记:Cookie保存的时间通过设置setMaxAge来设置 (默认值为-1)    如果大于0,就表示在客户机的硬盘上保存N秒。    如果小于0,就表示不将Cookie保存到客户机的硬盘上,当浏览器关闭时,Cookie当即消失。    如果等于0,就表示删除保存在客户机上的Cookie。

Cookie类的简单使用

public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        //向用户端写cookie        Random r = new Random();        int n = r.nextInt(100);        String name ="Jack";        Cookie c = new Cookie("name", name+n);        c.setMaxAge(60*60);        c.setPath( request.getContextPath());        response.addCookie(c);        // 演示cookie带中文        String str = "你好,夏天";        str = URLEncoder.encode(str,"utf-8");// 中文编码        Cookie cStr = new Cookie("str", str);        cStr.setPath("/");        response.addCookie(cStr);        //读取客户端发过来的cookie        Cookie cs[] = request.getCookies();        if(cs!=null){            for(Cookie cc:cs){                String name2 = cc.getName();                String val = cc.getValue();                val =URLDecoder.decode(val,"utf-8");//---解码                out.print(name2+"="+val+"<br/>");            }            out.print("保存成功!");        }    }

演示结果
这里写图片描述

cookie实例—查看用户上次登录时间

实现的主要思路:判断是否为第一次访问:如果是 输出欢迎信息,如果不是第一次访问 拿出上次存在Cookie的登录信息。 再更新这次访问时间到cookie里面去

public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        //拿Cookie        Cookie cs[] = request.getCookies();        boolean boo = false;        SimpleDateFormat sdf = new SimpleDateFormat(" yyyy--MM--dd HH:mm:ss");        if(cs!=null){            for(Cookie c:cs){                String name = c.getName();                if("LastTime".equals(name)){                    boo = true;                    String val = c.getValue();                    out.println("上次登录时间为:"+val);                }            }        }        if(!boo){ // 没拿到上次登录时间。。第一次            out.println("第一次登录欢迎你!");        }        //设置这次的登录时间进去        // new Cookie 既是新增、也是修改!  底层是Map()        Cookie c = new Cookie("LastTime", sdf.format( new Date().getTime()));        c.setMaxAge(60*60);        c.setPath("/");        response.addCookie(c);        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }

结果页面
第一次访问:
这里写图片描述
第二次访问:
这里写图片描述
在页面前端写cookie

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>>前端页面中用js来操作cookie技术演示</title>  </head>  <body>    <h2>>前端页面中用js来操作cookie技术演示</h2>    <br/><br/>    <div id="div1">    </div>    <div id="div2">    </div>    <script type="text/javascript">        //*创建/修改cookie ----如果存在则是修改,否则是新增        var date = new Date();        var tm = date.getTime()+ 1000*60*60*24; //以毫秒为单位        date.setTime(tm);        var nm ="中国2中4文8666";        nm = encodeURI(nm); //中文要进行编码        document.cookie="name2="+nm+";expires=" + date.toString()+";path=/";       //*/       //读取(遍历)cookies       var cs = document.cookie.split(";");//注意返回的是数组       for(var i=0; i<cs.length;i++){           div1.innerHTML =div1.innerHTML+ "<br/>"+cs[i];//这是没有解码的整个串           cs[i]=decodeURI(cs[i]);//解码,能够解决中文乱码           var str = cs[i].split("="); //每个cookie是一个"name=value"的字符串,要取出value得再解析           div2.innerHTML =div2.innerHTML+ "<br/>"+str[1];//只显示cookie的value值       }       //删除cookie       /*       var d = new Date(1970,1,1); //声明过期时间创建cookie即是删除       document.cookie="name2=aa;expires=" + d.toGMTString()+";path=/";       */    </script>  </body></html>

cookie实例—查看用户最近图片浏览记录。

实现思路:整个页面分为两部分 浏览记录(3张图片),和图库。每张图片包一个超链接,点击图片后,单独显示大图,后台调用Servlet服务把改图片明存放到cookie里面,当用户返回主要面时,后来再拿到刚刚用户访问图片的cookie 把他显示到浏览记录图片中。
Servlet代码

public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.println("<a href='"+request.getContextPath()+"/jsps/show.jsp'>返回</a>");        out.println("<hr/>");        //在新窗口中显示出用户当前点击浏览的图片        String img = request.getParameter("img");        String html = "<img src='"+request.getContextPath()+"/imgs/"+img+"'></img>";        out.println(html);        //把当前浏览的图片信息添加(记录)到 Cookie("images")中        //先把cookie读出来        Cookie cs[] = request.getCookies();        boolean boo = false; //是否存在浏览历史即Cookie("images")        if(cs!=null){            for(Cookie c: cs){                if(c.getName().equals("images")){//存在浏览历史                    String imgs = c.getValue(); //1.jpg,3.jpg,8.jpg                    if(imgs.indexOf(img)>=0){//最近浏览历史中存在当前图片                        //直接把记录中旧的当前图片名去掉                        imgs = imgs.replace(img, "");//1.jpg                        //以下处理可能存在的多余","号                        if(imgs.indexOf(",")==0){//开始处有","号                            imgs = imgs.substring(1);                        }else if(imgs.lastIndexOf(",")==imgs.length()-1){//末尾处有","号                            imgs = imgs.substring(0, imgs.length()-1);                        }else{// 中间处有","号                            imgs = imgs.replace(",,", ",");                        }                    }                    //把当前浏览的图片信息加入到imgs                     imgs = img + "," + imgs;                    //控制最多只保存3个图片信息                    if(imgs.split(",").length>3){                        imgs = imgs.substring(0, imgs.lastIndexOf(","));                    }                    //把更新后的imgs保存到cookie中                    c.setValue(imgs);                    c.setMaxAge(60*60*24*30);// 30天                    c.setPath("/");                    response.addCookie(c);                    boo=true;                    break;                }            }        }        if(boo==false){//不存在浏览历史即Cookie("images")            Cookie coo = new Cookie("images",img);            coo.setMaxAge(60*60*24*30);// 30天            coo.setPath("/");            response.addCookie(coo);        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }

show.jsp代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>图片浏览页面</title>    <style type="text/css">       img{          border: 0px;          width: 200px;          height:180px;       }       .img{          border: 0px;          width: 50px;          height:45px;       }    </style>  </head>  <body>    <h2>图片浏览页面,展示利用cookie记录用户最近访问的图片</h2>    <br/><br/>    <h3>您最近看过的图片</h3>    <%       String str = null;       Cookie  cs[] = request.getCookies();       if(cs!=null){           for(Cookie c: cs){               if(c.getName().equals("images")){                   str = c.getValue();                   break;               }           }       }       if(str!=null){           String strs[] = str.split(","); // str: 1.jpg,3.jpg,8.jpg           for(String s: strs){     %>              <img class="img" src='<%=request.getContextPath()%>/imgs/<%=s%>'></img>    <%            }       }    %>    <hr/>    <a href="<%=request.getContextPath()%>/ShowServlet?img=1.jpg">      <img src="<%=request.getContextPath()%>/imgs/1.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=2.jpg">      <img src="<%=request.getContextPath()%>/imgs/2.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=3.jpg">      <img src="<%=request.getContextPath()%>/imgs/3.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=4.jpg">      <img src="<%=request.getContextPath()%>/imgs/4.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=5.jpg">      <img src="<%=request.getContextPath()%>/imgs/5.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=6.jpg">      <img src="<%=request.getContextPath()%>/imgs/6.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=7.jpg">      <img src="<%=request.getContextPath()%>/imgs/7.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=8.jpg">      <img src="<%=request.getContextPath()%>/imgs/8.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=9.jpg">      <img src="<%=request.getContextPath()%>/imgs/9.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=10.jpg">      <img src="<%=request.getContextPath()%>/imgs/10.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=11.jpg">      <img src="<%=request.getContextPath()%>/imgs/11.jpg"></img>    </a>    <a href="<%=request.getContextPath()%>/ShowServlet?img=12.jpg">      <img src="<%=request.getContextPath()%>/imgs/12.jpg"></img>    </a>  </body></html>

显示结果(图一是我杰少。。哈哈哈)
这里写图片描述

下面是所有代码:项目截图
这里写图片描述
index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>Cookie-Session技术演示</title>  </head>  <body>    <h2>Cookie-Session技术演示</h2>    <a href="CookieDemo1">Cookie技术演示1</a> <br/>    <a href="servlet/CookieDemo2">该servlet用于演示Cookie的访问权限</a>    <br/><br/>    <a href="LoginServlet">利用Cookie技术显示上次登录的时间</a>    <br/><br/>    <a href="TestCookieNumServlet">测试浏览器支持cookie的数量和长度</a>    <br/><br/>    <a href="jsps/show.jsp">案例:利用cookie记录用户最近访问的图片信息</a>    <br/><br/>  </body></html>

cookdemo1.java

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import java.net.URLEncoder;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CookieDemo1 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        Random r = new Random();        int n = r.nextInt(100);        //创建一个cookie---里面的信息主要是:<key,value>        //Cookie coo = new Cookie("name", "Jack"+n); //内容为英文        //如果要往cookie中写中文信息(是value,不是key),那么得进行编码,,读取时要解码        String vv = "湖南"+n;        vv = URLEncoder.encode(vv, "UTF-8");//用utf-8编码        Cookie coo = new Cookie("name", vv);        //设置cookie的有效时间,生命周期,有效期 : 如果小于0则代表不保存在客户端        //coo.setMaxAge(60);//有效时间:以秒为单位  ---1分钟之后无效。过期后浏览器再次访问当前网站时不会在request带过来的        //coo.setMaxAge(60*60*24*7);//有效时间:以秒为单位  ---7天        coo.setMaxAge(0);  //把有效时间设为0即是通知浏览器删除该cookie---需注意一点的是,path要和原来旧的设成完全一样,否则删不掉!        System.out.println(n);        //cookie是通过paht来设置权限的---所设路径及其子路径url的servlet可以访问到该cookie,否则不行(所设path的上级路径或其它无关路径url的servlet无法访问)        coo.setPath("/"); //因为cookie是写给客户端用的,所为"/"代表的是Tomcat根目录。因此如果某cookie的path设成"/"则Tomcat下的所有项目中的servlet都能访问        response.addCookie(coo);//写到客户端        //读取cookie        Cookie cs[] = request.getCookies();        if(cs!=null){            for(Cookie c:cs){                String nm = c.getName();                String val = c.getValue();                //对val进行解码,以防止中文信息无法正确读取                val = URLDecoder.decode(val, "utf-8");                out.println("<br/>cookie:"+ nm +"="+val);            }        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

cookiedemo2

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import java.net.URLEncoder;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CookieDemo2 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        //创建一个cookie        String v = URLEncoder.encode("Java学习", "utf-8");        Cookie coo = new Cookie("abc",v);        coo.setMaxAge(60*10);        coo.setPath( request.getContextPath()+"/servlet" );        response.addCookie(coo);        //读取cookie        Cookie cs[] = request.getCookies();        if(cs!=null){            for(Cookie c:cs){                String nm = c.getName();                String val = c.getValue();                //对val进行解码,以防止中文信息无法正确读取                val = URLDecoder.decode(val, "utf-8");                out.println("<br/>cookie:"+ nm +"="+val);            }        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

LoginServlet.java

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        //读取所有cookie,遍历,看是否存在一个叫"loginTime"的cookie,若存在没把信息读取出来显示(上次登录时间),否则输出:第一次登录        Cookie cs[] = request.getCookies();        boolean boo=false;        if(cs!=null){            for(Cookie c: cs){                if(c.getName().equals("loginTime")){                    String strTime = c.getValue();                    long lg = Long.parseLong(strTime);                    Date d = new Date(lg);                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                    out.println( df.format(d) );                    boo = true;                    break;                }            }        }        if(!boo){            out.println("您是第一次登录.....");        }        //不管原来是否已经登录,都要把当前的最新登录时间创建成一个cookie存到客户端        String dt = new Date().getTime() + "";        Cookie coo = new Cookie("loginTime", dt);        coo.setPath( request.getContextPath() );        coo.setMaxAge(60*60*24*7); //有效期一周        response.addCookie(coo);//如果同名的cookie已经存在则是修改,否则是新加。        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

showservlet.java

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ShowServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.println("<a href='"+request.getContextPath()+"/jsps/show.jsp'>返回</a>");        out.println("<hr/>");        //在新窗口中显示出用户当前点击浏览的图片        String img = request.getParameter("img");        String html = "<img src='"+request.getContextPath()+"/imgs/"+img+"'></img>";        out.println(html);        //把当前浏览的图片信息添加(记录)到 Cookie("images")中        //先把cookie读出来        Cookie cs[] = request.getCookies();        boolean boo = false; //是否存在浏览历史即Cookie("images")        if(cs!=null){            for(Cookie c: cs){                if(c.getName().equals("images")){//存在浏览历史                    String imgs = c.getValue(); //1.jpg,3.jpg,8.jpg                    if(imgs.indexOf(img)>=0){//最近浏览历史中存在当前图片                        //直接把记录中旧的当前图片名去掉                        imgs = imgs.replace(img, "");//1.jpg                        //以下处理可能存在的多余","号                        if(imgs.indexOf(",")==0){//开始处有","号                            imgs = imgs.substring(1);                        }else if(imgs.lastIndexOf(",")==imgs.length()-1){//末尾处有","号                            imgs = imgs.substring(0, imgs.length()-1);                        }else{// 中间处有","号                            imgs = imgs.replace(",,", ",");                        }                    }                    //把当前浏览的图片信息加入到imgs                     imgs = img + "," + imgs;                    //控制最多只保存3个图片信息                    if(imgs.split(",").length>3){                        imgs = imgs.substring(0, imgs.lastIndexOf(","));                    }                    //把更新后的imgs保存到cookie中                    c.setValue(imgs);                    c.setMaxAge(60*60*24*30);// 30天                    c.setPath("/");                    response.addCookie(c);                    boo=true;                    break;                }            }        }        if(boo==false){//不存在浏览历史即Cookie("images")            Cookie coo = new Cookie("images",img);            coo.setMaxAge(60*60*24*30);// 30天            coo.setPath("/");            response.addCookie(coo);        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

TextCook…. .java

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestCookieNumServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //测试浏览器最多支持多少个cookie        /*        for(int i=1;i<=105;i++){            Cookie coo = new Cookie("ccc"+i, "hncu"+i);            coo.setMaxAge(60);            response.addCookie(coo);        }        */        String a ="1";//测试一个Cookie最多能放多少字节        for(int i=0;i<7000;i++){         a=a+"1";        }        System.out.println(">>>:"+a.getBytes().length);        Cookie c = new Cookie("dd",a);        c.setMaxAge(60*20);        response.addCookie(c);    }}
原创粉丝点击