目录
一、Cookie简介:
1.1 简介
Cookie一般存在与http协议头中,它是一个客户端的数据文件,用来保存一些浏览器会话中的信息。简单来说,就像我们平时在浏览器上登录某个账号,输入账号密码后下面有一个自动登录,当我们下一次进来的时候就可以不用再次输入账号密码,浏览器就会自动给我们登录账号。这就是cookie的一个简单应用,其实它就是将我们的账号、密码等信息存在电脑上的某个文件中,下次需要自动登录的时候它就会从文件中读取账号、密码,然后实现自动登录。(但是这样会有安全隐患,因为别人通过这个文件就可以知道我们的账号密码,所以又有了Session,这个在下一篇博客中说)
1.2 cookie的特点:
- cookie只能用于存储String类型的数据(存储汉字的时候会乱码)
- cookie村塾数据有大小限制,一般最大为4KB;浏览器上存储cookie有数量限制,最多可以存储300个,每个站点20个cookie
- cookie不太适合用来存储私有数据
二、Cookie中的常用方法:
Cookie中的常用方法 | |
创建cookie对象 | Cookie(String key, String value) |
获取cookie的key | getName( ) |
获取cookie的value | getValue( ) |
设置cookie的存活时间 | setMaxAge(int age) // 单位为秒 |
获取cookie的最大生存时间 | getMaxValue( ) |
设置cookie适用路径 | cookie.setPath("/") |
获取cookie的路径 | getPath() |
保存cookie数据 | response.addCookie(Cookie cookie) |
获取电脑上的所有cookie | requset.getCookies() // 返回值为一个Cookie的数组 |
三、使用案例:
案例1:cookie的基本使用:
执行时为了便于观察,现将电脑上的所有cookie数据清除,
然后运行servlet。
IDEA运行结果如下:
浏览器端查看Cookie信息结果如下:
案例2:记录上次登录时间
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.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class RecordTime 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 {
// 步骤分析:
// 首先确定记录上次访问时间的cookie名字为 lastTime 里面的值为上次访问时间的一个字符串
// 接下来先获取电脑上的所有cookie ,遍历,
// 如果有名字为lastTime的cookie
// 说明这不是第一次访问,就在浏览器输出cookie的内容,也就是上次的访问时间,并记录现在的系统时间
// 如果没有名字为lastTime的cookie
// 说明这是第一次访问,创建新的Cookie("lastTime", "当前系统时间")
// *********************************代码实现**********************************
// 因为要在浏览器输出内容,所以要设置编码格式
response.setContentType("text/html;charset=utf-8");
// PrintWriter对象,用于在浏览器输出内容
PrintWriter writer = response.getWriter();
// 先提示一下现在的系统时间
writer.write("当前系统时间为:"+ getNowTime());
// 加一个水平线分隔一下
writer.write("<hr/>");
// 获取电脑上的所有cookie,并遍历,找有没有名字为lastTime的cookie
Cookie cookie = getCookie("lastTime", request.getCookies());
// 如果cookie为空,就说明没有名字为lastTime的Cookie
if (cookie == null)
{
// 提示是第一次访问:
writer.write("欢迎第一次登陆~~~");
// 创建新的Cookie("lastTime", "当前系统时间")
cookie = new Cookie("lastTime", getNowTime());
}
else // 如果不为空
{
// 说明已经有名字为lastTime的Cookie了
// 获取cookie的值,在浏览器输出
writer.write("您上一次访问时间为:"+cookie.getValue());
// 将当前系统时间设置为这个Cookie的新值
cookie.setValue(getNowTime());
}
// 设置生存时间
cookie.setMaxAge(36000);
// 将cookie写入浏览器
response.addCookie(cookie);
}
private static String getNowTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss");
String format = sdf.format(new Date());
// System.out.println(format);
return format;
}
private Cookie getCookie(String name, Cookie[] cookies) {
if (cookies != null)
{
for (Cookie c : cookies)
{
if(c.getName().equals(name)) // 遍历Cookie数组,找对应的cookie
{
return c; //找到了就返回对应的cookie
}
}
}
// 如果没有找到对应名字的cookie,返回null
return null;
}
}
运行结果:
案例3:记录访问商品足迹
先来展示一下到最后实现出来的效果图:
大概效果就是这个样子,然后代码贴在下边。
首先,网上找了几张图片,做了几个简单的界面,用来代替浏览的商品和商品列表,代码如下:
商品列表的界面: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;
}
}