目录
一、Cookie简介:
1.1 简介
1.2 cookie的特点:
二、Cookie中的常用方法:
Cookie中的常用方法
三、使用案例:
案例1:cookie的基本使用:
案例2:记录上次登录时间
案例3:记录访问商品足迹
Cookie一般存在与http协议头中,它是一个客户端的数据文件,用来保存一些浏览器会话中的信息。简单来说,就像我们平时在浏览器上登录某个账号,输入账号密码后下面有一个自动登录,当我们下一次进来的时候就可以不用再次输入账号密码,浏览器就会自动给我们登录账号。这就是cookie的一个简单应用,其实它就是将我们的账号、密码等信息存在电脑上的某个文件中,下次需要自动登录的时候它就会从文件中读取账号、密码,然后实现自动登录。(但是这样会有安全隐患,因为别人通过这个文件就可以知道我们的账号密码,所以又有了Session,这个在下一篇博客中说)
requset.getCookies()
// 返回值为一个Cookie的数组
执行时为了便于观察,现将电脑上的所有cookie数据清除,
然后运行servlet。
IDEA运行结果如下:
浏览器端查看Cookie信息结果如下:
运行结果:
先来展示一下到最后实现出来的效果图:
大概效果就是这个样子,然后代码贴在下边。
首先,网上找了几张图片,做了几个简单的界面,用来代替浏览的商品和商品列表,代码如下:
商品列表的界面:product_list.jsp
<%@ page import="per.fei._3浏览商品记录.MyGetElementById" %><%-- Created by IntelliJ IDEA. User: ASUS Date: 2019/5/26 Time: 20:09 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>列表清单</title> </head> <body> <table border="0px" > <tr> <td colspan="4"> <img src="../img/顶部.jpg" width="100%" /> </td> </tr> <tr> <td> <a href="/getById?id=1"> <--这里的/getById是后台获取数据的映射路径--> <img src="../img/001.jpg" /> </a> </td> <td> <a href="/getById?id=2"> <img src="../img/002.jpg" /> </a> </td> <td> <a href="/getById?id=3"> <img src="../img/003.jpg" /> </a> </td> <td> <a href="/getById?id=4"> <img src="../img/004.jpg" /> </a> </td> </tr> </table> <hr/> <% // 使用java代码,在浏览器输出浏览记录(输出对应id的图片) Cookie cookie = MyGetElementById.getCookieByName("history", request.getCookies()); if (cookie == null) { out.print("浏览足迹空空如也,亲 请尽情浏览~~~"); } else { out.print("您最近访问过:"+"<br/>"); String[] ids = cookie.getValue().split("-"); for (int i=0; i<ids.length; i++) { if (!ids[i].equals("")) { out.print("<img src='../img/00"+ids[i]+".jpg' width=\"80\" height=\"80\"/>"); } } } %> </body> </html>每一个商品界面:001.jsp
<%-- Created by IntelliJ IDEA. User: ASUS Date: 2019/5/26 Time: 20:00 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>watch</title> </head> <body> <center> <img src="../img/001.jpg" width="200" height="200"/> </center> <center> 价格:888 <a href="">立即购买</a> <a href="product_list.jsp">回到主页</a> </center> </body> </html>002.jsp
<%-- Created by IntelliJ IDEA. User: ASUS Date: 2019/5/26 Time: 20:01 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>watch</title> </head> <body> <center> <img src="../img/002.jpg" width="200" height="200"/> </center> <center> 价格:666 <a href="">立即购买</a> <a href="product_list.jsp">回到主页</a> </center> </body> </html>这里的每一个商品的页面就是把对应的图片之类的信息换一下就可以了,这里就放这两个的代码,对比一下就能看出来,基本都是一样的。
最后是在后台的操作:
package per.fei._3浏览商品记录; import org.omg.PortableServer.LIFESPAN_POLICY_ID; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class MyGetElementById extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码 response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); // 获取参数 String id = request.getParameter("id"); // System.out.println(id); // 判断当前cookie中是否包含当前产品 // 获取所有Cookie,寻找名字为history的那一个 // 如果没有对应的Cookie,就说明现在浏览记录为空 // 新建一个cookie,用来存放当前访问的商品id // 如果有对应的Cookie,就说明访问历史记录存在(历史记录数量应该有上限,这里以3个作为最大历史记录数量) // 首先判断当前Cookie中是否包含当前商品, // 包含的话就把原来的删掉,在把他头插到当前cookie中 // 如果不包含: // 如果当前访问历史记录大于等于3,就删掉最后一个,然后将当前的商品头插 // 如果不足三个,就直接在头部插入当前商品 // 获取名字为history的Cookie Cookie cookie = getCookieByName("history", request.getCookies()); // 如果cookie为空,说明当前浏览记录为空,创建新Cookie,将id写入cookie中 if (cookie == null) { cookie = new Cookie("history", id+"-"); // 写入的id中间用-分隔 } else // 如果cookie不为空,说明当前浏览记录不为空 { // 将cookie中的值取出来,放在一个LinkedList链表中(LinkedList方便头插尾删) String[] ids = cookie.getValue().split("-"); // 转为数组 LinkedList<String> list = new LinkedList(Arrays.asList(ids)); // 转为LinkedList // 如果cookie中已经存在当前商品的id,就把这个id放在第一个位置(删掉原来的,在头插新的) if (list.contains(id)) { list.remove(id); //删掉原来的 list.addFirst(id); // 再将id头插 } else // 如果不存在这个id { // 判断长度是否大于3 if (list.size() < 3) // 如果小于3,直接将id头插 { list.addFirst(id); } else // 如果大于等于3,删掉最后一个记录,头插一个新的记录 { list.removeLast(); list.addFirst(id); } } // 现在链表里面的数据就是跟新好了的浏览记录,在将每一个元素取出来放在cookie中,保存在浏览器端 StringBuffer sb = new StringBuffer(); for (String str : list) { sb.append(str+"-"); // 每一个记录之间用空格分开 } cookie.setValue(sb.toString()); } cookie.setMaxAge(36000); response.addCookie(cookie); // 这些操作都弄完之后执行页面跳转,调到指定的商品页面中去 response.sendRedirect("/history/00"+id+".jsp"); } // 获取对应name的Cookie public static Cookie getCookieByName(String name, Cookie[] cookies) { if(cookies != null) { for (Cookie c : cookies) { if (c.getName().equals(name)) { return c; } } } return null; } }