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保存在客户机器上的原因是为了跟踪客户的状态。这主要用于特殊的场合如电子商务。 - JavaServletApi为Cookie提供了简单实现,javax.servlet.http.Cookie类表示Cookie - Cookie保存客户端的硬盘上,通过key和value值来保存信息,类似于Map。Cookie的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); }}
- cookie学习
- 学习Cookie
- cookie学习
- Cookie学习
- Cookie学习
- Cookie学习
- Cookie学习
- cookie学习
- cookie学习
- Cookie学习
- Asp.Net Cookie 学习
- cookie学习笔记
- Cookie学习之一
- Servlet学习:Cookie练习
- cookie的学习
- cookie学习一
- cookie学习二
- .NET学习:Cookie案例
- 1060. 爱丁顿数(25)
- 获取系统信息1——linux系统中的时间
- IDEA工作常用快捷键
- &a[0]和&a 的区别?
- NGUI 中 Label 字体大小变化的问题
- Cookie学习
- 【Linux】进度条
- 计算机网络面试常考知识点
- 高仿微信app实战(二)- 自定义View实现底部导航栏
- Android学习之基于DrawerLayout的侧边栏实现
- apache静态服务器配置
- 搭建IntelliJ IDEA+gitbucket+git多人开发环境
- Spring MVC Hello案例
- 最流行的Java IDE有哪些?