Cookie入门

会话技术

会话技术常用的有两种: Cookie技术,Session技术,这两种技术是有区别的.

Cookie : 会话数据会保存在浏览器客户端
Session技术: 会话数据会保存在服务器端

Cookie技术

特点

Cookie技术,会话数据保存在浏览器客户端

Cookie核心技术

Cookie类: 用于存储会话数据的类.

核心方法:

构造方法

1. Cookie(String name,String value);   // 构造方法  

设置cookie方法:

2. void setPath(String uri);    // 设置cookie的有效访问路径
3. void setMaxAge(int expiry);    // 设置cookie的有效时间
4.void setValue(String newValue);     // 设置cookie的值

发送Cookie到浏览器端保存

//在服务器创建Cookie,但服务器并不保存Cookie数据,而是把Cookie数据发送到浏览器端进行保存
5. void response.addCookie(Cookie cookie);  // 发送cookie

服务器接收Cookie信息

// 被保存在浏览器的Cookie信息是可以发送回服务器端的.
6.Cookie[ ] request.getCookies();    // 用于接收浏览器端发送的Cookie信息
Cookie原理
  1. 服务器创建Cookie对象,把会话数据储存在Cookie对象中.

     new Cookie("name',"eli");
    
  2. 服务器发送Cookie信息到浏览器

     // 通过set-cookie响应头,将数据发送给浏览器
     response.addCookie(cookie);
    
  3. 浏览器得到服务器发送的Cookie,然后保存在浏览器端

  4. 浏览器在下次访问服务器时,会通过cookie请求头自动携带被保存的cookie信息

  5. 服务器可以接收到浏览器携带有Cookie信息的请求信息

     Cookie cookies[ ] = request.getCookies();
    
Cookie的细节

setPath()

// 设置Cookie的有效访问路径
 void setPath(String url);

有效路径指的是:Cookie可被浏览器找的路径,在Cookie被保存在可被浏览器找到的位置的情况下,浏览器在访问服务器时就会携带Cookie信息,否则就不带.

默认情况下,Cookie的有效路径在当前的web应用下,(/FileReadWrite)


Cookie入门_第1张图片
在不设置Cookie有效路径时

setMaxAge()

// 设置Cookie的有效时间
void setMaxAge(int expiry);
  • 正整数: 表示将Cookie数据保存在浏览器的缓存目录中(硬盘中),数值的大小表示存储的时间

      以秒为单位,从最后一次请求含有Cookie信息页面后开始计算.
      如果在单位时间内再次请求,则会刷新Cookie时间,重新开始计算
    
  • 负整数: 表示将Cookie数据保存在浏览器的内存中,浏览器关闭Cookie就会丢失.

  • 零 : 表示删除同名Cookie数据

Cookie的局限性

  • Cookie只能保存非中文的字符串数据类型,,
  • Cookie的保存个数和大小是有限制的.
    • 浏览器一般只允许存放300个Cookie
    • 每个站点最多存放20个Cookie
    • 每个Cookie的大小限制为4KB

Cookie使用案例

案例1 显示用户上次访问的时间

需求

  1. 首次访问显示: 您是首次访问本网站,当前时间为 : 2017/11/15 14:10
  2. 第n次访问显示: 欢迎回来,您上次访问的时间为 : 2017/11/15 14:10, 当前时间为 : 2017/11/15 14:12

使用Cookie方式实现

public class HistServlet extends HttpServlet {

/**
 * 需求
 * 1. 首次访问显示: 您是首次访问本网站,当前时间为 : 2017/11/15 14:10
 * 2. 第n次访问显示: 欢迎回来,您上次访问的时间为 : 2017/11/15 14:10, 当前时间为 : 2017/11/15 14:12
 */

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    setEncoding(request, response);
    // 获取当前时间
    String curTime = getCurrentTime();
    
    // 判断是否是第一次登录
    if (isFirstVisit(request)) {
        response.getWriter().write("您是首次访问本网站,当前时间为" + curTime);
        getLastTimeAndSaveCurrentTime(request, response, curTime);
    } else {
        response.getWriter().write("欢迎回来,您上次访问的时间为 : " + 
                                   getLastTimeAndSaveCurrentTime(request, response, curTime) + 
                                  ", 当前时间为 :" + curTime);
    }

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

/**
 * 设置请求编码响应
 * @param request
 * @param response
 * @throws UnsupportedEncodingException
 */
private void setEncoding(HttpServletRequest request, HttpServletResponse response)
        throws UnsupportedEncodingException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
}

/**
 * 是否是第一次访问本网站
 * @param cookies   请求中携带的Cookie数组
 * @return 如果是第一次访问返回true 否则返回false
 */
private boolean isFirstVisit(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    String lastTimeString = null;
    boolean isFirstVisit = true;
    
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if ("lastTime".equals(cookie.getName())) {
                isFirstVisit = false;
                break;
            } 
        }
    } else {
        isFirstVisit = true;
    }
    
    return isFirstVisit;
}

/**
 * 
 * @param curTime
 *            本次访问的时间
 * @return 返回上一次访问的时间
 */
private String getLastTimeAndSaveCurrentTime(HttpServletRequest request, HttpServletResponse response,
        String curTime) {
    String lastTime = null;

    // 找到名为lastTime的Cookie的值返回
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if ("lastTime".equals(cookie.getName())) {
                lastTime = cookie.getValue();
            } 
        }
    }
    
    // 保存当前请求时间,并将时间发送给浏览器
    Cookie cookie = new Cookie("lastTime", curTime);
    cookie.setMaxAge(86400);
    response.addCookie(cookie);

    return lastTime;
}

/**
 * 获取当前时间,并将时间以yyyy-MM-dd hh:mm:ss的格式返回
 * 
 * @return 返回系统当前时间
 */
private String getCurrentTime() {
    String currentTime = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    currentTime = dateFormat.format(new Date());
    return currentTime;
}

}

你可能感兴趣的:(Cookie入门)