1、Cookie的API
*方法
-getName();
得到Cookie的名称
-getValue();
得到Cookie的值
-setMaxAge(int expiry);
设置Cookie得有效时长
*Cookie分类(两种)
-会话级别的Cookie
特点是浏览器关闭之后,cookie就销毁了,默认就是会话级别的cookie。
-持久性的Cookie
在一定的范围内,cookie会一直有效。
使用到上述的方法,
//持久性Cookie设置方式
//设置有效时长
cfirst.setMaxAge(3600);
//设置有效路径
cfirst.setPath("/");
--持久性cookie销毁
-第一种:到期销毁
-第二种:
--setMaxAge(0);//设置为0
--设置有效路径setPath("/");要保证要销毁的cookie路径和设置的路径一样。
--回写到浏览器内存中
-setPath(String url);
有效路径:
-通过这个访问,会携带cookie信息。比如setPath("day10");
-http://127.0.0.1/day10/aa在地址栏输入地址会携带Cookie信息
-http://127.0.0.1/day11/aa在地址栏输入地址不会携带cookie信息
*技巧性设置
setPath("/");
-setDomain(String pattern);
*有效域名的路径
-通过这个域名访问,会携带cookie信息
-比如 setDomain("www.sina.com");
在地址栏输入一个地址 http://www.sina.com会携带cookie信息
在地址栏输入一个地址http://www.news.sian.com不会携带cookie信息
-存在一个设置技巧
setDomain(".sina.com");//设置顶级域名
2、使用cookie记录用户上次访问时间
*实现功能:
第一次访问:向页面输出welcome;
第二次访问:把第一次产生的访问时间显示出来;
第三个访问:把第二次产生的访问时间显示出来;
*步骤:
第一次访问想页面输出欢迎信息,并产生一个访问时间,使用cookie返回到浏览器内存中
第二次访问,带着内存中第一次时间进行访问,到服务器得到第一次时间,并显示到页面页面上,产生新时间,在通过cookie返回到浏览器内存中,以此类推
-注意如何判断是否是第一次访问?
*方法:
- Cookie[] getCookies() HttpServletRequest
返回一个数组,其中包含客户端通过此请求发送的所有Cookie对象
- void addCookie(Cookie cookie) HttpServletResponse
通过cookie把这个值返回到浏览器的内存中(回写)
向响应添加指定的cookie。可以多次调用此方法来设置多个cookie。
-Cookie(String name ,String value)
使用cookie的构造函数
-getName()
获取cookie名称
*代码演示
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到所有的cookie
Cookie[] cookies = request.getCookies();
//假设访问返回cookit名称是visit,判断是否是第一次访问,使用addCookie方法,可以一个key对应多个value
Cookie cookie = findCookie(cookies,"visit");
//如果是第一次
if(cookie == null)
{
response.getWriter().write("Welcome");
}
else
{
//得到上次访问时间
String time1 = cookie.getValue();
response.getWriter().write(time1);
}
//产生新的时间
Date date = new Date();
String time = date.toLocaleString();
//把time回写到浏览器内存中
Cookie cfirst = new Cookie("visit",time);
response.addCookie(cfirst);
}
//判断cookie数组里面是否有名称是visit的cookie
private Cookie findCookie(Cookie[] cookies, String string) {
if(cookies == null)
{
return null;
}
for (Cookie cookie : cookies) {
//使用方法getName()得到cookie的名字
if(cookie.getName().equals("visit"))
{
return cookie;
}
}
return null;
}
3、cookie细节问题
*一个Cookie只能表示一种信息,它至少含有一个标识该信息的名称(Name)和设置值(Value)
*一个web站点可以给一个web浏览器发送多个cookie,一个web浏览器也可以存储多个web站点提供的cookie
*浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个Cookie的大小限制为4KB
*如果创建一个cookie,并将它发送到浏览器,默认情况下它是一个回话级别的cookie(即存储在浏览器的内存中,用户退出浏览器之后即销毁)
*删除持久性的cookie,可以将cookie最大时效设为0,注意,删除cookie时,path必须要保持一致,否则不会删除成功
4、使用cookie记录用户浏览的商品记录
*步骤
-使用不同的id区分不同的商品
超链接<a href="/day10/aa?id=1">aa</a>:类似于get提交
-第一次购买,在服务器得到商品id,把id值回写到浏览器内存中
-第二次购买,带着第一次购买的id进行访问,在服务器端获取id,然后把两次的id都返回给浏览器,以此类推
*判断是否是第一次购买?
-首先得到所有的cookie
-遍历cookie数组,判断是否有相同的cookie即可
*判断商品的id值,是否已经存在cookie里面,如果存在,不需要回写,不存在才需要回写到浏览器的内存中
*清空浏览记录
-销毁cookie,清空浏览记录
--创建一个和要销毁的cookie相同名称
Cookie cookie = new Cookie("history","");
--设置有效时长 0
cookie.setMaxAge(0);
--设置有效路径
cookie.setPath("/");
--回写cookie
response.addCookie(cookie);
*代码演示
-CookieDemo2.java
/**
* 实现记录用户浏览的商品
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 得到id
String id = request.getParameter("id");
// 判断是否是第一次浏览
Cookie[] cookies = request.getCookies();
// 判断是否有history名称的cookie
Cookie cookie = MyCookieUtils.findCookie(cookies, "history");
// 判断第一次
if (cookie == null) {
Cookie cookieFirst = new Cookie("history", id);
// 设置持久性cookie
cookieFirst.setMaxAge(3600);
cookieFirst.setPath("/");
// 回写cookie
response.addCookie(cookieFirst);
} else {
// 得到上一次浏览的id值
String values = cookie.getValue();
String[] ids = values.split(",");
boolean flag = MyCookieUtils.checkID(ids, id);
// 如果不相同回写
if (!flag) {
String newId = values + "," + id;
Cookie cookieNew = new Cookie("history", newId);
// 设置持久性cookie
cookieNew.setMaxAge(3600);
cookieNew.setPath("/");
// 回写cookie
response.addCookie(cookieNew);
}
}
// 回到页面
response.sendRedirect("/day10/cookie/product.jsp");
}
-CookieDemo3.java
/**
*清空浏览记录
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie cookie = new Cookie("history","");
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
response.sendRedirect("/day10/cookie/product.jsp");
}
-product.jsp
<body>
<img alt="1" src="/day10/img/1.jpg" />
<a href="/day10/CookieDemo2?id=1" />手电
</a>
<img alt="2" src="/day10/img/2.jpg" />
<a href="/day10/CookieDemo2?id=2" />手机
</a>
<img alt="3" src="/day10/img/3.jpg" />
<a href="/day10/CookieDemo2?id=3" />电视
</a>
<img alt="4" src="/day10/img/4.jpg" />
<a href="/day10/CookieDemo2?id=4" />冰箱
</a>
<a href="/day10/CookieDemo3">清空浏览记录</a>
<h1>浏览记录</h1>
<%
//得到所有的cookie
Cookie[] cookies = request.getCookies();
//判断Cookie是否有名称
Cookie cookie = MyCookieUtils.findCookie(cookies, "history");
if (cookie == null) {
//没有任何浏览信息
%>
<h1>没有任何浏览信息</h1>
<%
} else {
//得到cookie里面的值
String values = cookie.getValue();
String[] ids = values.split(",");
for (String id1 : ids) {
int id = Integer.parseInt(id1);
String[] names = { "手电", "手机", "电视", "冰箱" };
String name = names[id - 1];
%>
<h3>
<img src="/day10/img/<%=id%>.jpg" /><%=name%></h3>
<%
}
}
%>
</body>
-MyCookieUtils.java
public class MyCookieUtils {
// 判断Cookie是否有这个名称的cookie
public static Cookie findCookie(Cookie[] cookies, String name) {
if (cookies == null) {
return null;
}
for (Cookie cookie : cookies) {
if (cookie.getName().equals(name)) {
return cookie;
}
}
return null;
}
// 核查id是否存在
public static boolean checkID(String[] ids, String id) {
for (int i = 0; i < ids.length; i++) {
if (ids[i].equals(id)) {
return true;
}
}
return false;
}
}