目录

  • 会话跟踪技术
  • `Cookie` 概述
  • `Cookie` 的简单使用
  • `Cookie` 细节
    • `Cookie` 的覆盖
    • `Cookie` 有效期
    • `Cookie` 修改和删除
    • `Cookie` 与跨域问题

会话跟踪技术

会话可以简单的理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如,用户在某个浏览器中访问某一个 Web 应用,只要不关闭该浏览器,不管该用户点击该 Web 应用的多少个超链接,访问多少资源,直到关闭浏览器之前,整个的这个访问过程我们称为一次会话

在一个会话的多个请求中共享数据,这就是会话跟踪技术。会话跟踪技术可以解决我们很多问题。比如最常见的就是一个用户在登陆一个网站之后,请求该网站的其他页面和资源时免登录的功能,又比如购物网站中常见的显示曾经浏览过的商品的功能,又比如某些购物网站允许未登录用户可以添加商品到临时购物车中的功能

常见的会话跟踪技术有 CookieSessionCookie 是先出现的

Cookie 概述

由于 HTTP 是一种无状态的协议,但为了实现期望的保持状态功能,于是引入了 Cookie 技术。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态

简单的说:Cookie 是由服务器创建,然后通过响应发送给客户端的一个键值对,这个键值对中包含了要该会话想要记住的状态信息,客户端会保存这个 Cookie,并会标注出 Cookie 的来源(哪个网站的 Cookie)。当客户端再一次向该网站发出请求时会把所有这个网站的 Cookie 包含在请求报文头中发送给服务器,这样服务器就可以根据该请求携带的 Cookie 信息识别客户端,并且得到之前的状态信息了

第一次,没有 Cookie 信息状态下的请求


第二次开始,存有 Cookie 信息状态的请求

Cookie 的简单使用

JavaServlet 规范中,可以非常简单的设置和获取 CookieCookie 被抽象成为一个 Cookie

  • 当要设置 Cookie 的时候,需要创建 Cookie 对象并且设置 keyvalue,随后通过 response 响应对象的 addCookie() 方法添加这个 Cookie 即可,Web 服务器会自动将 response 中的 Cookie 发送给客户端
  • 客户端在随后对该 Web 应用的其他资源进行访问的时候,将会自动带上服务器发送的 Cookie(同一个服务器的其他 Web 应用也不会发送)
@WebServlet("/cookie-servlet")
public class CookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");// 生成一个随机字符串String id = UUID.randomUUID().toString();// 创建Cookie对象,指定名字和值。Cookie类只有这一个构造器Cookie cookie = new Cookie("id", id);// 在响应中添加Cookie对象resp.addCookie(cookie);resp.getWriter().print("已经给你发送了ID");}
}

在访问 /hello-servlet 资源时,用于测试 Cookie,该 Servlet 中通过 request 请求对象的 getCookies() 方法获取 Cookie

@WebServlet("/hello-servlet")
public class HelloServlet extends HttpServlet {@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {Cookie[] cookies = request.getCookies();// 如果请求中存在Cookieif (cookies != null) {// 遍历所有Cookiefor (Cookie c : cookies) {// 获取Cookie名字,如果Cookie名字是idif ("id".equals(c.getName())) {response.getWriter().print("您的ID是:" + c.getValue());}}}}
}

Cookie 细节

Cookie 的覆盖

如果服务器端多次发送重复 keyCookie,那么后发送的 Cookie 会覆盖原有的 Cookie,例如客户端的第一个请求服务器端发送的 Cookie 是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个 Cookie,即:a=AA

如果服务器端一次发送多个重复 keycookie,那么当客户端再次请求的时候,只携带最后一个设置的 Cookie 的值

Cookie 有效期

所谓 Cookie 的有效期就是 Cookie 在客户端的最大有效时间,我们可以通过 setMaxAge(int) 方法来设置 Cookie 的有效时间,单位秒

  • cookie.setMaxAge(-1)cookiemaxAge 属性的默认值是 -1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么 cookie 就会消失。生命值为负数的 Cookie 也被称为内存 Cookie
  • cookie.setMaxAge(60*60):表示 cookie 对象可存活 1 小时。当生命值大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活 1 小时,除非将 Cookie 从硬盘上手动清理了。生命值为正数的 Cookie 也被称为硬盘 Cookie
  • cookie.setMaxAge(0)cookie 生命值等于 0 是一个特殊的值,它表示 cookie 被作废。也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 CookiesetMaxAge(0) 来要求浏览器删除这个 Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie

Cookie 修改和删除

Cookie 并没有提供直接的修改和删除功能,但是根据前面 Cookie 的覆盖和有效期属性,可以间接的修改和删除 Cookie

当想要修改 Cookie 时,可以发送同名 keyCookie,这样以前的旧 Cookie 就被覆盖了。当想要删除 Cookie 时,同样设置同名 keyCookiemaxAge = 0 即可

Cookie 与跨域问题

默认情况下,不同的域名中设置的 Cookie 不可以共享,即跨域问题

cookie 有一个 setDomain() 方法,可以设置 Cookiedomain 属性(域名),表示 Cookie 在域名级别中的作用范围。如果不设置,那么默认范围就是当前域名

Web开发之Cookie相关推荐

  1. web开发之Cookie使用

    做过web开发的小伙伴对于Cookie一定不陌生,当用户登录后将用户的账号保存到本地,密码保存时,建议使用MD5进行加密,以防止用户个人信息的泄露.今天和大家简单聊聊关于Jquer Cookie的使用 ...

  2. 移动web开发之rem布局(rem基础、媒体查询、 less 基础、rem适配方案)

    移动web开发之rem布局 一.rem基础 rem单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小. 不同的是rem的基准是相对于html元素的字体大小. 比如,根元素 ...

  3. 17. 【移动Web开发之flex布局】

    文章目录 [移动Web开发之flex布局]前端小抄(17) 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 ...

  4. 「学习笔记」移动Web开发之flex布局9

    「学习笔记」移动Web开发之flex布局9 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 3.1 常见父项 ...

  5. WEB开发之HTML与CSS够用即可-庞永旺-专题视频课程

    WEB开发之HTML与CSS够用即可-113人已学习 课程介绍         讲解常用的HTML标签与CSS样式.这些常用的HTML标签与CSS样式都是本人多年从业经验的总结.只要熟练我总结的HTM ...

  6. 移动WEB开发之-REM(rem)布局

    目录 移动WEB开发之REM布局 rem基础 rem单位 媒体查询 什么是媒体查询 媒体查询语法规范 1.mediatype 查询类型 2.关键字 3.媒体特性 4.媒体查询书写规则 less 基础 ...

  7. Python Web开发之WSGI

    Python Web开发之WSGI WSGI(全称Web Server Gate Interface,Web服务器网关接口)是Python为了规范和简化Web服务开发过程,定义了一种Web服务器和应用 ...

  8. Swift Web 开发之 Vapor - 入门(一)

    简介 Vapor 是一个基于纯 Swift 构建出的 Web 开发框架,目前可以运行在 macOS 和 Ubuntu ,用于构建出漂亮易用的网站或者 API 服务. 官方称是用的最多的 Swift w ...

  9. Swift Web 开发之 Vapor - 模版 Leaf(三)

    模版引擎,对现在的 Web 开发极为重要,几乎所有主流 Web 框架都会支持一种或多种模版引擎,模版引擎可以分离用户界面和业务逻辑,工作原理主要是一种翻译,后端对特定的标记.语法.变量等渲染后再输送给 ...

  10. 18. 【移动Web开发之rem适配布局】

    文章目录 [移动Web开发之rem适配布局]前端小抄(18) 一.rem单位 1.1 rem 单位 二.媒体查询 2.1 什么是媒体查询 2.2 语法规范 2.2.1 mediatype 查询类型 2 ...

最新文章

  1. 基于固态激光雷达Livox的建图与定位系统!提供Docker自测!
  2. Java ArrayDeque工作原理及实现
  3. Leetcode 100. 相同的树 解题思路及C++实现
  4. AI:一个20年程序猿的学习资料大全—人工智能之AI/机器学习/深度学习/计算机视觉/Matlab大赛——只有你不想要的,没有你找不到的
  5. docker mysql 不稳定_docker 的 mysql 容器运行一段时间后崩溃
  6. 串口调试助手-打开报错
  7. SAP Commerce Cloud B2B Organization 功能简介
  8. java 死锁的检测与修复_调查死锁–第4部分:修复代码
  9. 【李宏毅2020 ML/DL】P77 Generative Adversarial Network | Theory behind GAN
  10. 批量传输mysql的表空间_MySQL 表空间传输
  11. 软件著作权申请流程(自助申请免费登记)
  12. cad汉仪长仿宋体_hzcf.shx字体下载
  13. Java十大常用框架介绍
  14. Android Wi-Fi 2.4G及5G信道一览表
  15. VMware安装CentOS 7.0 Fail to start media check on /dev/sr0
  16. 新加坡国立大学计算机学院师资,我系教师刘志刚赴新加坡国立大学访学
  17. unity给物体更改颜色
  18. 98% after emitting CopyPlugin问题
  19. 不能打开淘宝单个商品页面
  20. 专访凌云光技术3D视觉业务部经理李淼:做好技术和产品,为VR行业服务

热门文章

  1. 381.O(1)时间插入、删除和获取随机元素-允许重复
  2. 375.猜数字大小II
  3. JSP标签,jsp:include,jsp:forward用法介绍及示例
  4. 用Theano学习Deep Learning(三):卷积神经网络
  5. unity 入门学习之(二)脚本学习
  6. 【ZOJ 4097 The 19th Zhejiang University Programming Contest H】Rescue the Princess【边双连通缩点+LCA】
  7. mysql给日期创建索引_如何在MySql的DATETIME字段的日期部分创建索引
  8. Raki的读paper小记:ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS
  9. Raki的统计学习方法笔记0x2章:感知机
  10. 68.x的平方根(力扣leetcode) 博主可答疑该问题