会话技术 – Cookie与Session及其两者的区别

(一)会话技术

一、概述


1. 一个浏览器为了实现某一个功能对服务器产生了多次请求响应。从第一个请求开始访问服务器,会话开始,到最后一个页面访问结束 关闭所有页面,这个过程中的所有的请求响应加在一起称之为 浏览器和服务器之间产生了一次会话。
2. 会话技术最重要的是会话中产生的数据如何保存 。
1. request域 – 不合适。request太小了,每一次请求都会产生一个新的request , 后续的请求无法读取到之前请求的request中存放的数据 。
2. servletContext – 不合适。 所有的会话看到的都是同一个ServletContext域 , 所有会话的数据会混杂在一起
3. cookie – 将会话产生的数据存放在客户端
4. session – 将会话产生的数据保存在服务器中

(二)Cookie

一、概述

  1. Cookie是客户端技术 将会话产生的数据保存在客户端中
  2. 当浏览器访问服务器 服务器可以通过在响应中增加set-Cookie的响应头 命令浏览器保存一段cookie信息
  3. 浏览器会将cookie信息保存在本地 之后再去访问服务器时 会自动在请求中 通过cookie请求头 带着cookie信息
  4. 服务器可以通过解析请求中的cookie请求头 获取信息 从而获取到了之前保存的会话相关的数据

二、基本方法

  1. Cookie(String name ,String value) :cookie没有无参构造方法 , 在创建时就得制定好cookie的名字和值 。
  2. getName() : cookie的名字只能获取不能修改
  3. getValue(String name) : 通过名字获取对应的值
  4. setValue(String name , String value) : 通过名字设置对应的值 。
  5. response.setCookie(Cookie c): 向响应中添加cookie
  6. request.getCookies() : 从请求中获取所有的cookie

三、cookie保存时长

  1. 如果不设置cookie保存时长 , 默认cookie会保存在浏览器内存中 , 浏览器关时cookie销毁 , 这种称之为会话级别的cookie 。
  2. 可以通过代码制定浏览器将cookie保存到什么时候 , 浏览器收到的 cookie信息中如果包含了cookie超时时间 , 浏览器就会把cookie信息以文件的形式保存在浏览器的临时文件夹中 , 保存到指定的时间 , 这段时间内cookie文件一直存在 , 即使对此开关 浏览器仍然能够读取到这个cookie信息。

    设置超时时间
    setMaxAge(int time);//单位是秒
    获取超时时间
    getMaxAge()
    

四、浏览器访问哪些路径时会携带cookie

  1. 如果不设置 , 默认在访问发送cookie给浏览器的servlet的父一级目录及子孙目录时会携带这个cookie 。
  2. 可以通过代码设置浏览器在访问哪些路径时携带这个cookie

    设置路径
    setPath(String  path);
    获取携带这个cookie的路径
    getPath();
    

五、删除cookie

  1. java提供的Cookie类中本身没有删除一个cookie的方法 , 但是可以通过一些方法实现删除cookie的效果 。
  2. 如果想要删除一个cookie , 需要发送一个和要删除的cookie名字相同 , path相同 , 但是maxAge为0的cookie 。
  3. 原理: 当发送一个与原cookie名字相同 , path也相同的cookie时 , 原cookie将会被覆盖 , 但是新cookie的maxAge为0 , 即刚被创建就被删除 , 从而实现了删除一个cookie 。

六、Cookie其他

  1. 一个Cookie只能标示一种信息 , 他至少含有一个标识信息的名字(name)和设置值(value)。
  2. 一个WEB站点可以给一个web浏览器发送多个cookie , 一个web浏览器也可以存储多个web站点提供的cookie 。
  3. 浏览器一般只允许存放300个cookie, 且 每个站点最多 能存放20个从cookie , 每个cookie的大小被限制在4KB以内 。
  4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  5. 注意:浏览器是通过name+path来唯一标示一个cookie的 。 在删除一个cookie时name和path必须一致 , value可以随意设置 。

八、案例

  1. 登录时记住用户名和密码 。

(三)Session

一、Session概述

  1. session时服务器端会话保存技术
  2. 服务器在需要时 , 可以为每个用户创建一个独一无二的为该用户服务的session对象 , 其中保存着该用户会话相关的数据 。
  3. 之后该用户再来访问服务器时 , 可以找到志强创建的属于他的session , 从中找到之前 保存的数据 。 从而实现会话数据的保存 。
  4. 由于每个用户各自有各自的session , 每一个session只为对应的用户服务 , 所以数据不会产生混乱 。

二、session是一个域对象

  1. 生命周期:

    1. 当第一次调用request。getSession()方法时表明会话中需要硬session来服务了, 此时服务器会创建一个session对象 , 一直驻留在内存中为当前会话服务 。
    2. session有三种销毁方式:
      1. 自杀: 可以通过明确调用session.invalidate()方法立即杀死当前session 。
      2. 寿终正寝 : session默认发呆时间为30分钟 , 如果超过30分钟没有用户使用这个session , 则服务器会认为这个session超时 , 杀死会话对应的session 。
      3. 意外身亡 : 当web应用销毁时 , session也随之销毁 。
  2. 作用范围: 整个会话
  3. 主要功能: 在会话范围内共享数据

三、常用方法

  1. 创建、获取session

    获取一个session对象 , 如果当前 会话已经有session对象 , 则直接获取 , 如果没有则创建
    request.getSession();
    当传入的值为true时 , 与上面的方法相同 ; 如果传入的参数为false时 , 当前会话存在session时直接获取 , 不存在时返回null
    request.getSession(boolean b);
    
  2. 操作域

    //设置session数据
    session.setAttribute();
    //获取session数据
    session.getAttribute();
    //移除session数据
    session.removeAttribute();
    
  3. 杀死session

    session.invalidate()
    

四、案例

  1. 利用session实现登录 、 注销

    1. 登录

      1. 所谓的登录其实就是用户提交用户名和密码 后检查数据库
      2. 如果不正确就跳转回登录界面并提示用户重新输入
      3. 如果正确则创建 session保存该用户的登录标记
      4. 在之后的访问中可以通过 检查登录 标记货值该用户 是否登录 , 如果登录过 ,该用户是谁 。
    2. 注销
      1. 所谓的注销其实就是杀死session,使session中的登录标记失效 。
  2. 验证码校验
    1. 验证码图片生成之后将图片发送至页面 , 并且将验证码中的内容存入session中备用
    2. 用户提交参数后 ,从请求中获取验证码参数 , 再从session中获取验证码 元数据 , 两者比对
    3. 如果验证码不通过返回注册页面 数据回显
  3. 数据回显
    1. 数据在发送前被存放在request域中在进行发送
    2. 如果后台校验不通过 , 则请求转发回注册页面
    3. 此时request还是发送请求时的那个request , 直接从中取相应的值就行 。

五、session原理

  1. 实际上session是基于一个叫做jsessionid的 cookie工作的 。
  2. 当浏览器访问服务器调用到request.getSession()时 , 此方法会检查请求中是否有叫做jsessionid的cookie 。如果没有 , 则说明这是第一次用到session , 此时服务器会自动创建一个session使用 , 并将sessionid作为name为jsessionid的cookie的值发送给浏览器保存 。浏览器在后续的访问中 , 就会带着 这个jsessionid来访问 , 后续再调用到request.getSession()时, 此方法会检查请求中是否有叫做jsessionid的cookie , 如果有则在浏览器内存中找jsessionid对应的session使用 。 如果找不到 , 说明session已经被销毁 ,则创建一个新的session使用 , 并在响应中发送新的jsessionid 。

六、cookie被禁用后session无法被使用的情况

  1. 如果禁用了cookie session也就用不了了 - 可以通过URL重写来解决
  2. 如果禁用了cookie 浏览器不再基于cookie来保存jsessionid 在服务器无法获取到jsessionid 也就无法找对应的session
  3. 所以想解决这个问题 就需要想办法 将jsessionid的值 带给服务器。此时可以使用URL重写的技术来实现
  4. URL重写

    1. 所谓的URL的重写 就是 将地址 改写 在地址后使用特殊的参数 携带jsessionid的技术 。
    2. 虽然cookie用不了了 但是 通过地址 仍然可以携带jsessionid的信息 从而使用session
    3. 这个技术 需要将应用中所有的地址都要进行URL重写 相对来说非常麻烦
    4. 而这么麻烦带来的唯一的好处是 禁用cookie后仍然可以使用session 似乎并不值得这么麻烦
    5. 所以 现在很多网站 都不会去做URL重写 对于禁用cookie的情况 不处理 或者 检测到用过户禁用cookie就引导用户 打开浏览器的cookie 再来使用网站
    6. 示例:

      response.encodeURL(String url);
      //--如果是普通的地址用这个方法
      response.encodeRedirectURL(String url);
      //--如果地址是用来进行重定向的,用这个方法
      

(四)Cookie与session的区别

  1. cookie将会话相关数据保存在客户端 ; session将会话相关的数据保存在服务器端
  2. cookie可以保存的时间比较长; session超过30分种没人用就销毁
  3. cookie有可能随着用户的操作被清除 ;session只要不手动删除 在存活期间可以可靠的访问
  4. cookie将信息保存在浏览器中 可以通过翻临时文件夹 查看cookie中的数据 不安全; session将会话相关的数据保存在服务器内存中 安全性高很高。
  5. 如果需要将会话数据保存的很久 – cookie
  6. 如果希望会话数据不会因为用户的操作丢失 – session
  7. 如果会话数据比较在意安全性 – session

大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别相关推荐

  1. 大数据WEB阶段(二十)更新丢失

    更新丢失 一.更新丢失概述 两个并发的事务 , 基于同一个查询进行更新操作 ,后提交的事务忽略了先提交的事务对数据库的影响 , 结果造成了数据库操作失误的问题, 称之为更新丢失. 二.实例 重复充值 ...

  2. 大数据WEB阶段 TransientDateAccessResourceException

    大数据WEB阶段 TransientDateAccessResourceException 一 . 分析 如果数据库保存的字段有时间 , 但是没有给该字段赋值时 ,则该字段默认是0000-00-00 ...

  3. 2021年大数据Kafka(十二):❤️Kafka配额限速机制❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka配额限速机制 限制producer端的速率 限制c ...

  4. 2021年大数据HBase(十二):Apache Phoenix 二级索引

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Apache Phoenix 二级索引 一.索引分类 ...

  5. 2021年大数据Hive(十二):Hive综合案例!!!

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive综合案例 一.需求描述 二.项目表的字段 三.进 ...

  6. PHP自学之路----会话技术(cookie session)

    会话技术 l  什么是会话 打开浏览器,访问某个网站的很多资源(页面=)通过超链接),当你关闭浏览器后,一个会话结束. l  思考一个问题 在意个会话中,用户会产生一些数据,比如购物车,每个用户查看购 ...

  7. 大数据WEB阶段(六)MySql详解(二)

    MySql详解(二) 一.分组查询 语法: select col_name1,col_name2... from tb_name group by having ...; 练习: 执行下面的SQL,创 ...

  8. 大数据WEB阶段总结

    一.概述 HTTP协议 web容器 - Tomcat 静态web资源 - 本质上是文件 html css js 图片 音频 视频 flash- 动态web资源 - 本质上是程序 Servelt JSP ...

  9. 大数据WEB阶段(九)Servlet+Request

    Servlet与Request 一.概述 Servlet 是sun公司提供的一门用于开发动态web资源的技术 按照这套规范写出来的servlet可以放置在web应用中在servlet容器中运行 . 开 ...

最新文章

  1. 前腾讯员工不堪房价压力回老家进国企!终于过上了清闲的日子,他又担心这个问题?...
  2. curl get post 示例
  3. poj2441 Arrange the Bulls
  4. 常用Oracle系统表查询
  5. python queue get 方法_Python Queue模块详解
  6. 推荐一款免费国产远程办公神器ToDesk,TeamViewer完美替代品
  7. 最常用的动态sql语句梳理Mybatis(转)
  8. leaf 叶子(张量)
  9. 支付宝工程师如何搞定关系数据库的“大脑”——查询优化器
  10. oracle中保留2位小数的写法
  11. redis 6.0 redis-proxy搭建
  12. python之验证身份证号合法性的库:id_validator
  13. Android第二个小练习:拨号提醒
  14. IE下table的innerHTML无效的处理方法
  15. 4.16访问日志不记录静态文件,访问日志切割以及静态元素过期时间
  16. 前后端开发接口文档模板(登录、注册、项目发布与需求发布)
  17. 花书笔记1——向量乘法、矩阵乘积(相乘)、内积、点积都是什么、Python代码实现、区别及联系
  18. uni-app微信小程序——商城(8)——订单详情
  19. ffmpeg的那点小事儿--编译ffmpeg同时支持libx264(视频编码)和libfdk(音频编码)
  20. 小电科技CTO“肉山”芦宇峰:互联网过35岁就遭裁员?如何应对职业危机

热门文章

  1. StrutsPreparedAndExcuteFilter与Interceptor
  2. HttpClient的释放问题
  3. hdu 1874 畅通工程续(模板题 spfa floyd)
  4. pyqt5 实现右键自定义_《快速掌握PyQt5》第十七章 事件处理
  5. 透明色代码是多少_北京宣传画册印刷多少钱
  6. Java黑皮书课后题第10章:*10.20(近似e)编程练习题5.26使用下面数列近似计算e(略),为了得到更好的精度,在计算中使用25位精度的BigDecimal
  7. 5.编写程序,由键盘任意输入10个整数,分别统计其中的奇数和偶数的个数。
  8. 【2012百度之星 / 资格赛】I:地图的省钱计划
  9. C#实现数据回滚,A事件和B事件同时执行,其中任何一个事件执行失败,都会返回失败...
  10. OSI七层模型非专业简介