一、cookie介绍

1.简单介绍

Cookies是一个很少的信息片段,可自动地在浏览器和Web服务器间交互,因此Cookies可存储在多个页面间传递信息。Cookie是HTTP Headers的一部分,其传输由HTTP协议控制,此外,可以控制Cookies的有效时间。浏览器通常支持20多个cookie。简单地说,cookie是一种浏览器会话技术,将浏览器和服务器之间的产生数据记录下来,在登录时有效。

举个例子:淘宝(登录/不登录)--->如果不登录--->将会话数据保存在cookie(加入购物车的数据),如果登录-->服务器(session中)。

2.cookie的细节:(不适合存储私有数据)

1)只能存储String类型的数据
2)浏览器存储cookie的个数限制:300个
tomcat/webapp里面的文件都是站点,每一个站点可以存储20多个cookie,每一个cookie的大小不超过4Kb.
3)有效期的问题:
public void setMaxAge(int expiry):cookie的有效期:默认浏览器关闭时
设置cookie的最大生存时间,以秒为单位。参数为正整数:超过了当前的值,表示cookie过期了。
参数为0:清空浏览器记录;直接将cookie会话结束。
public void setPath(String uri):设置当前cookie的有效路径
如果存在项目名称:  由”/项目名称“到”/rem",如果设置了有效路径,才能使用cookie的数据。
4)cookie不能存储中文的数据。要存储中文,必须加密和解密。URLDecoder  URLInCoder

二、cookie的应用场景

1)打开浏览器-->访问网站--->填写用户登录数据(会话数据)--->校验成功-->首页,显示当前用户的用户名信息-->关闭浏览器
直接打开浏览器--->访问同一个网站-->直接显示用户信息
2)访问一个商品列表-->点击某一个商品--->浏览器关闭
下一次进来-->访问商品列表-->记录之前访问过的商品数据

三、cookie的使用

1.有关cookie的一些方法

1)服务器端创建Cookie,将cookie的数据携带给浏览器。

public Cookie(String name,String value)(响应头:setCookie:key=vlaue)

2)通过浏览器端将数据存储在缓存区中,(请求头:cookie:key=value)

public void addCookie(Cookie cookie)将cookie写回浏览器,等待下次访问。
			将指定的cookie添加到响应,可多次调用此方法。

3)在后台获取cookie。

public Cookie[] getCookies();//由request对象调用

4)获取cookie的名称

public String getName()

5)获取cookie的内容

public String getValue();//返回cookie的值

6)设置cookie的最大生命周期,以秒为单位。

public void setMaxAge(int expiry)

2.cookie的简单使用

1)创建cookie
2)将cookie数据由服务器创建,并写回到浏览器。
3)再次访问浏览器,可以获取cookie数据。

package cookie;

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;

public class HelloCookieServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置编码
        response.setContentType("text/html;charset=utf-8");
        //2.创建cookie  cookie由服务器创建,并携带给浏览器
        Cookie a=new Cookie("akey","avalue");
        //3.由服务器写回到浏览器
        response.addCookie(a);//响应头cookie:akey=avalue
        Cookie b=new Cookie("bkey","bvalue");
        Cookie c=new Cookie("ckey","cvalue");
        Cookie d=new Cookie("dkey","dvalue");
        response.addCookie(b);
        response.addCookie(c);
        response.addCookie(d);
        response.getWriter().write("cookie已经写回了");
        //4.获取cookie的数据
        Cookie[] cookies=request.getCookies();
        //先判断,再使用
        if(cookies!=null){
            for(Cookie cookie:cookies){
                System.out.println(cookie.getName()+"="+cookie.getValue());
            }
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

结果:

cookie Expires是微秒吗 cookie

在谷歌浏览器中的设置-高级-内容设置-Cookie-查看所有cookie和网站数据中可以看到

cookie Expires是微秒吗 cookie

3.记录上一次访问的时间

步骤分析:
    创建一个Servlet:RememberServlet  url-pattern:/rem
    1)假设cookie名称:lastTime   new Cookie("lastTime",long类型的系统时间);
    2)public Cookie[] getCookies():通过api获取指定名称的cookie。
    3)判断当前获取到的cookie是否为空,如果为空,提示”您是第一次访问“;
        如果不为空,获取当前指定名称的cookie值,lastTime.
        String-->Long :parseLong(value)-->long---->Date对象-->toLocalString()"提示您上次访问的时间是+toLocalString"
    4)把当前的系统时间记录下来 :new Cookie("lastTime",currentTime);
    5)由服务器将cookie携带给浏览器, addCookie(cookie);

package com.xunpu.rem;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.util.Date;

@WebServlet(name = "RemberServlet")
public class RemberServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置编码格式
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer=response.getWriter();//通过writer向浏览器中输出内容
        //2.获取指定的cookie(名称为:lastTime)
        //从指定的方法中获取指定的cookie
        Cookie cookie=getByName("lastTime",request.getCookies());
        //3.判断当前的cookie
        if(cookie==null){
            //3.1 如果为空,直接提示当前是第一次访问
            writer.write("您当前是第一次访问");
        }else {
            //3.2 若不为空,获取当前指定的cookie内容--->Date的日期字符串形式(提示上一次访问的时间是)
            String value=cookie.getValue();
            //value-->long-->Date
            long time=Long.parseLong(value);
            //创建一个Date对象
            Date date=new Date(time);//SimpleDateFormat
            writer.write("您上一次访问的时间是:"+date.toLocaleString());//输出本地时间字符串
        }
        //4.记录当前的系统时间
        cookie=new Cookie("lastTime",new Date().getTime()+"");
        //设置会话有效期为1小时
        cookie.setMaxAge(3600);
        //获取上下文路径
//        cookie.setPath(request.getContextPath());
        //5.写回浏览器
      response.addCookie(cookie);
    }

    /**
     * 通过指定的名称获取对应的cookie
     * @param name 指定名称
     * @param cookies 当前浏览器中的所有的cookie数据
     * @return
     */
    public Cookie getByName(String name,Cookie[] cookies){
        if(cookies!=null){
            //遍历所有的cookie
            for(Cookie c:cookies){
                //判断当前的name名称就是需要的cookie
                if(name.equals(c.getName())){
                    return c;
                }
            }
        }
        return null;
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}