概述
本篇博客简单学习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学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复