cookie 简介

什么是 cookie

cookie,有时我们也用其复数形式 cookies,是服务端保存在浏览器端的数据片段。以 key/value的形式进行保存。每次请求的时候,请求头会自动包含本网站此目录下的 cookie 数据。网站经常使用这个技术来识别用户是否登陆等功能。

简单的说,cookie 就是服务端留给计算机用户浏览器端的小文件。

  • HTTP   是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的 Web 程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于 http 协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而 Cookie 就是解决方案之一。
  • Cookie 实际上就是服务器保存在浏览器上的一段信息。浏览器有了 Cookie 之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据   该信息处理请求。
  • 例如:我们上文说的网上商城,当用户向购物车中添加一个商品时,服务器会将这个条信息封装成一个 Cookie 发送给浏览器,浏览器收到 Cookie,会将它保存在内存中(注意这里的内存是本机内存,而不是服务器内存),那之后每次向服务器发送请求,浏览器都会携带该 Cookie,而服务器就可以通过读取 Cookie 来判断用户到底买了哪些商品。当用户进行结账操作时,服务器就可以根据 Cookie 的信息来做结算。
  • Cookie 的用途: 网上商城的购物车 保持用户登录状态
  • Cookie 的缺点

     Cookie 做为请求或响应报文发送,无形中增加了网络流量。

     Cookie 是明文传送的安全性差。

     Cookie 中保存数据是不稳定的,用户可以随时清理 cookie,各个浏览器对 Cookie 有限制,使用上有局限

庐山真面目

chrome 的 cookie 位置:

C:\Users\lfy\AppData\Local\Google\Chrome\User Data\Default\Cookies

ie 中 cookie 位 置 : C:\Users\lfy\AppData\Local\Microsoft\Windows\InetCache 点击设置->查看对象即可

chrome 中查看 cookie

cookie 如上图所示

从上图可以看出 cookie 是键值对的形式,有过期时间(Max-Age,session 表示在这个会话期内有效)。

cookie 原理

1)总的来看 Cookie 像是服务器发给浏览器的一张“会员卡”,浏览器每次向服务器发送请求时都会带着这张“会员卡”,当服务器看到这张“会员卡”时就可以识别浏览器的身份。实际上这个所谓的“会员卡”就是服务器发送的一个响应头:

2)如图 Set-Cookie 这个响应头就是服务器在向服务器发“会员卡”,这个响应头的名字是 Set-Cookie , 后 边 JSESSIONID=95A92EC1D7CCB4ADFC24584CB316382E 和 Path=/Test_cookie,是两组键值对的结构就是服务器为这个“会员卡”设置的信息。浏览器收到该信息后就会将它保存到内存或硬盘中。

3)当浏览器再次向服务器发送请求时就会携带这个 Cookie 信息:

Cookie 的使用

创建对象

cookie 是由服务端创建的,由浏览器端保存的。所以创建对象我们应该在服务端创建 cookie,cookie 的创建方法:

1)创建一个 CookieServlet

在 Servlet 的 doPost()方法中编写如下代码:

//创建一个Cookie对象
Cookie cookie = new Cookie("username", "zhangsan");
//将Cookie对象放入response对象中response.addCookie(cookie);

2)在浏览器中访问该 Servlet,会发现响应头中出现如下内容: Set-Cookie: username=zhangsan

如此就成功的向浏览器设置了一个 Cookie,当我们在刷新页面时会发现浏览器的请求头中出现如下代码:

Cookie: username=zhangsan

3)同样我们还可以同时设置多个 Cookie:

//创建一个Cookie对象
Cookie cookie1 = new Cookie("username", "zhangsan");
Cookie cookie2 = new Cookie("password", "123456");
Cookie cookie3 = new Cookie("age", "20");
//将Cookie对象放入response对象中
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);

浏览器会按以下形式发送 Cookie:

Cookie: username=zhangsan; password=123456; age=20

4)设置 Cookie 就是两个步骤: 创建 Cookie 对象

将 Cookie 对象加入到 response 中

设置 cookie

cookie 的有效时间

1)经过上边的介绍我们已经知道 Cookie  是存储在浏览器中的,但是可想而知一般情况下浏览器不可能永远保存一个 Cookie,一来是占用硬盘空间,再来一个 Cookie 可能只在某一时刻有用没必要长久保存。

2) 所以我们还需要为 Cookie 设置一个有效时间。

3)通过 Cookie 对象的 setMaxAge()可以设置 Cookie 的有效时间。

其中 setMaxAge()接收一个 int 型的参数,来设置有效时间。参数主要有一下四种情况:

  • 设置为 0,setMaxAge(0)

    Cookie 立即失效,下次浏览器发送请求将不会在携带该 Cookie

  • 设置大于 0,setMaxAge(60)

    表示有效的秒数 60 就代表 60 秒即 1 分钟,也就是 Cookie 在 1 分钟后失效。

  • 设置小于 0,setMaxAge(-1)

    设置为负数表示当前会话有效。也就是关闭浏览器后 Cookie 失效

  • 不设置

    如果不设置失效时间,则默认当前会话有效。

cookie 的路径

1) Cookie 的路径指告诉浏览器访问那些地址时该携带该 Cookie,我们知道浏览器会保存很多不同网站的 Cookie,比如百度的 Cookie,新浪的 Cookie,腾讯的 Cookie 等等。那我们不可能访问百度的时候携带新浪的 Cookie,也不可能访问每个网站时都带上所有的 Cookie 这是不现实的,所以往往我们还需要为 Cookie 设置一个 Path 属性,来告诉浏览器何时携带该 Cookie。

2)我们同过 Cookie 的 setPath()来设置路径,这个路径是由浏览器来解析的所以/代表服务器的根目录。

如:设置为 /项目名/路径  cookie.setPath(“/项目名/路径”),这样设置只有访问“/项目名/路径”下的的资源才会携带 Cookie

如:/项目名/路径/1.jsp 、/项目名/路径/hello/2.jsp 等

如果不设置,默认会在访问“/项目名”下的资源时携带如:“/项目名/index.jsp” 、 “/项目名/hello/index.jsp”

Cookie cookie = new Cookie("username", "abc"); cookie.setMaxAge(60*60*24);//秒为单位,一天后过期
cookie.setPath(getServletContext().getContextPath()+"/");
resp.addCookie(cookie);
resp.sendRedirect(getServletContext().getContextPath()+"/index.jsp");

读取 cookie

通过以上步骤,我们将 cookie 保存到了浏览器端。那么我们如何读取 cookie 中的值呢。分析:

cookie 被设置进入浏览器后,每次请求都会携带 cookie 的值,所以我们需要从 request 中取出 cookie 进行解析。

//从request中获取所有cookie
Cookie[] cookies = request.getCookies();
//遍历cookie
for(Cookie c:cookies){
  String cName = c.getName();//获取cookie名String cValue = c.getValue();//获取cookie值
  System.out.println("cookie:" + cName + "=" +cValue);
}

一文带你超详细了解Cookie的更多相关文章

  1. 干货,一文带你超详细了解Session的原理及应用

    session 简介 session 是我们 jsp 九大隐含对象的一个对象. session 称作域对象,他的作用是保存一些信息,而 session 这个域对象是一次会话期间使用同一个对象.所以这个 ...

  2. 干货,一文带你超详细了解 Filter 的原理及应用

    提出问题 1.我们在访问后台很多页面时都需要登录,只有登录的用户才能查看这些页面,我们需要   在每次请求的时候都检查用户是否登陆,这样做很麻烦,有没有一种方法可以在我们请求之   前就帮我们做这些事 ...

  3. js的dom对象(带实例超详细全解)

    js的dom对象(带实例超详细全解) 一.总结 一句话总结: 1.DOM中的方法区分大小写么? 解答:区分 2.DOM中元素和节点的关系式什么? 解答:元素就是标签,节点中有元素节点,也是标签,节点中 ...

  4. 超详细的Cookie增删改查

    目录 1,什么是 Cookie? 1.1,存储形式 1.2,常用属性 1.3,大小限制 2,增 or 改Cookie 3,查Cookie 4,删Cookie 1,什么是 Cookie? Cookie是 ...

  5. 【Python扩展阅读【转】EasyGui 学习文档【超详细中文版】】

    翻译改编自官方文档:http://easygui.sourceforge.net/tutorial/index.html 翻译改编者:小甲鱼,本文欢迎转载,转载请保证原文的完整性! 演示使用 Pyth ...

  6. EasyGui 学习文档【超详细中文版】

    演示使用 Python 3.3.3 版本 0. 安装 EasyGui 官网:http://easygui.sourceforge.net 最新版: <ignore_js_op> easyg ...

  7. mac自带功能超详细介绍

    mac自带的超实用的功能分享给大家,包含自带的Spotlight(聚焦) 计算器功能,预览的 PDF 压缩功能,切换同一应用的不同窗口等,让您的工作更加轻松. 1.Spotlight(聚焦) 计算器功 ...

  8. 如何在idea中将项目生成API文档(超详细)(Day_32)

    1.打开要生成API文档的项目,点击菜单栏中的Tools工具,选择Generate JavaDoc 2.打开如下所示的Specify Generate JavaDoc Scope 界面 3.解释下Ot ...

  9. 一文读懂:超详细正态分布方差等于o的推导

    (uv)' = [(u+△u)(v+△v) - uv] /△x = (v△u+u△v +△u△v)/△x = v(△u/△x) + u(△v/△x) +(△u△v)/△x =u'v+uv'

随机推荐

  1. COSO企业风险管理框架2017版发布!看看有哪些变化?

    近期,COSO发布了新版(2017版)的企业风险管理框架:<企业风险管理—与战略和业绩的整合>.相较于2004年发布的上一版框架<企业风险管理—整合框架>,新框架强调了制定战略 ...

  2. Django-CKedtior图片找不到的问题

    从Django Packages站点上找到这个CKeditor集成组件:https://github.com/shaunsephton/django-ckeditor 按照官方的install方法安装 ...

  3. Codable实现json转Model,是时候干掉HandyJSON了!

    自从开始使用Swift做项目,一直都在使用HandyJSON,不可否认,HandyJSON在Swift4.0是个好东西,也尝试过其它json转mode的工具,最终发现还是HandyJSON最好用. 去 ...

  4. MySQL创建全文索引

    使用索引时数据库性能优化的必备技能之一.在MySql数据库中,有四种索引:聚焦索引(主键索引).普通索引.唯一索引以及我们这里将要介绍的全文索引(FUNLLTEXT INDEX). 全文索引(也称全文 ...

  5. Yii2基本概念之——生命周期(LifeCycle)

    人有生老病死,一年有春夏秋冬四季演替,封建王朝有兴盛.停滞.衰亡的周期律--"其兴也勃焉,其亡也忽焉".换句话说,人,季节,王朝等等这些世间万物都有自己的生命周期.同样地,在软件行 ...

  6. hadoop is running beyond virtual memory limits问题解决

    单机搭建了2.6.5的伪分布式集群,写了一个tf-idf计算程序,分词用的是结巴分词,使用standalone模式运行没有任何问题,切换到伪分布式模式运行一直报错: hadoop is running ...

  7. html5 兼容版本 video

    <!-- first try HTML5 playback: if serving as XML, expand `controls` to `controls="controls&q ...

  8. C++ 利用流来进行string和其他类的转换

    通过这种方法可以实现任意转换,需要头文件 #include<string> #include<sstream> 期中sstream提供了我们的主角string流,下面给出int ...

  9. Selenium2Lib库之键盘常用关键字实战

    Press Key关键字 按F5 查看Press Key关键字的说明,如下图: Press Key关键字是用于通过键盘模拟由定位器确定的元素的用户按键.‘值’是单个字符,字符串或数值的ASCII码的“ ...

  10. Java并发之ReentrantLock

    一.ReentrantLock简介 ReentrantLock字面意义上理解为可重入锁.那么怎么理解可重入这个概念呢?或者说和我们经常用的synchronized又什么区别呢? ReentrantLo ...