尚硅谷JavaWeb笔记——Cookie(一文读懂什么是Cookie技术)

Cookie饼干

Cookie简介

什么是Cookie?

答:Cookie是服务器同志客户端保存键值对的一种技术,客户端有了Cookie后,每次请求都会发送给服务器。每个Cookie的大小都不能超过4kb。

Cookie有关操作

Cookie的创建

Cookie的创建流程如下所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2SpLNFO-1614148377982)(/Users/gaojunsong/Library/Application Support/typora-user-images/Java学习/JAVAWeb/image-20210219102353603.png)]

说明:Cookie是服务器中Servlet程序创建并通过response返回给客户端浏览的的键值对信息。在服务器中需要执行两个关键的操作

//1 创建Cookie对象
Cookie cookie = new Cookie("key0", "v0");
Cookie cookie1 = new Cookie("key1", "v1");
Cookie cookie2 = new Cookie("key2", "v2");
//2 通知客户端保存Cookie
response.addCookie(cookie);
response.addCookie(cookie1);
response.addCookie(cookie2);
response.getWriter().write("Cookie 创建 ");

如果不执行response.addCookie(cookie),浏览器将无法知道服务器创建了cookie,可以在浏览器的检查中查看到Cookies信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqRsp2EC-1614148377984)(/Users/gaojunsong/Library/Application Support/typora-user-images/Java学习/JAVAWeb/image-20210219103111791.png)]

Cookie的获取

cookie获取的流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KHs9nsfA-1614148377985)(/Users/gaojunsong/Library/Application Support/typora-user-images/Java学习/JAVAWeb/image-20210219104629282.png)]

服务器获取客户端的Cookie只需要一行代码

protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Cookie[] cookies = request.getCookies();

  Cookie iWannaCookie = CookieUtils.findCookie("key1", cookies);}

// 如果不等于null,说明赋过值,也就是找到了需要的Cookie
if (iWannaCookie != null) {
  response.getWriter().write("OK 找到了!cookie :  " + iWannaCookie.getName() + " = " + iWannaCookie.getValue() + "<br/>");

}
}

查找cookie工具类

public class CookieUtils {
  /**
     * 查找指定名称的Cookie对象
     * @param name
     * @param cookies
     * @return
     */
  public static Cookie findCookie(String name, Cookie cookies[]) {
    if (name == null || cookies == null || cookies.length == 0) {
      return null;
    }
    for (Cookie cookie: cookies) {
			// 如果找到了cookie
      if (name.equals(cookie.getName())) {
        return cookie;
      }
    }
    return null;
  }
}

Cookie值的修改

方案一:(创重名再发送)

  1. 创建一个要修改的同名的Cookie对象
  2. 在构造器,同时赋予新的Cookie值
  3. 调用response.addCookie(Cookie);

方案二:(找目标重复值)

  1. 先查找到需要修改的Cookie对象
  2. 调用setValue()方法赋予新的Cookie值
  3. 调用response.addCookie()通知客户端保存修改
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //方案一:
  //1、先创建一个要修改的同名的Cookie对象
  //2、在构造器,同时赋于新的Cookie值。
  Cookie cookie = new Cookie("key1","newValue1");
  //3、调用response.addCookie( Cookie ); 通知 客户端 保存修改
  resp.addCookie(cookie);

  //方案二:
  //1、先查找到需要修改的Cookie对象
  Cookie cookie = CookieUtils.findCookie("key1", request.getCookies());
  if (cookie != null) {
    //2、调用setValue()方法赋于新的Cookie值。
    cookie.setValue("newV1");
    //3、调用response.addCookie()通知客户端保存修改
    response.addCookie(cookie);
  }
  response.getWriter().write(" ok方案2 ");
}

⚠️ cookie值不支持符号以及中文

Cookie的生命周期

Cookie的声明控制是指如何管理Cookie什么时候被删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHOCBbDH-1614148377987)(/Users/gaojunsong/Library/Application Support/typora-user-images/Java学习/JAVAWeb/image-20210219105404934.png)]

设置Cookie生命周期为默认值

/**
     * 默认的会话级别的Cookie
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
protected void defaultLifeCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Cookie cookie = new Cookie("d1", "d1v1");

  cookie.setMaxAge(-1);//设置存活时间

  response.addCookie(cookie);

}

设置Cookie生命周期为立即删除

/**
     * 马上删除一个Cookie
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
protected void deleteNowCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // 先找到你要删除的Cookie对象
  Cookie cookie = CookieUtils.findCookie("key1", request.getCookies());
  if (cookie != null) {
    // 调用setMaxAge(0);
    cookie.setMaxAge(0);// 表示马上删除,都不需要等待浏览器关闭
  }
  // 调用response.addCookie(cookie);
  response.addCookie(cookie);
  response.getWriter().write("删除 k1 ");
}

设置Cookie生命周期为一个小时

/**
     * 设置存活1个小时的Cooie
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
protected void life3600Cookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Cookie cookie = new Cookie("life", "life3600");

  cookie.setMaxAge(60 * 60);// 设置Cookie一小时之后被删除。无效
  response.addCookie(cookie);
  response.getWriter().write("已经创建了一个存活一小时的Cookie");
}

Cookie有效路径Path的设置

Cookie的path属性可以有效的过滤那些Cookie可以发给服务器,那些不发。path属性是通过请求的地址来进行有效过滤

protected void pathCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Cookie cookie = new Cookie("path1", "pathCookie1");
  // getContextPath() ===>>>>  得到工程路径
  cookie.setPath(request.getContextPath() + "/abc");// ===>>>>  /工程路径/abc
  response.addCookie(cookie);
  response.getWriter().write("创建了一个带有Path路径的Cookie");
}

练习:免用户名登陆

免用户名登陆的细节原理及细节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zJ7bSisG-1614148377988)(/Users/gaojunsong/Library/Application Support/typora-user-images/Java学习/JAVAWeb/image-20210219111623848.png)]

类加载失败的可能的原因

  1. web.xml出问题(过滤器+路径写错)
  2. tomcat以及javaEE版本不匹配
  3. artifacts中数据缓存,删除artifacts并重新添加
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值