文章目录

  • 简述
  • cookie
    • 如何创建cookie
    • 如何获取cookie
    • cookie原理
  • session
    • 如何创建session
    • 如何获取session
    • session原理
  • 边角料

简述

cookie和session是开发中常用的记录状态的机制。

相同点:

  • 他们两个都可以用来存私密的东西,同样也都有有效期的说法。
  • cookie和session都是用来跟踪浏览器用户身份的会话方式。

不同点:

  • cookie数据保存在客户端,session数据保存在服务器端。
  • session是放在服务器上的,过期与否取决于服务器的设定,cookie是存在客户端的,过期与否在cookie生成的时候设置进去,也可以自己清理掉。
  • 从服务器角度来看,cookie不能跨浏览器查询,session可以跨浏览器查询(sessionid传值)

运用:

  • cookie是不很安全的,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session

  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE ;

  • 所以我们可以将登陆信息等重要信息存放为seesion;其他信息如果需要保留可以放在cookie中。

cookie是什么:

  • cookie是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据。

session是什么

  • Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。

cookie

如何创建cookie

添加cookie

@WebServlet("/addCookie")
public class AddCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("name", "likeghee");resp.addCookie(cookie);resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("添加cookie成功");}
}

调用一下接口

F12查看响应头能看到Set-Cookie

如何获取cookie

@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {resp.setContentType("text/html;charset=utf-8");resp.getWriter().write(cookie.getName() + "--" +cookie.getValue() + "|||||");}}
}

调用getCookie接口

F12查看network,我们可以看见客户端又通过请求头将cookie传给服务器端,所以为什么服务器可以通过req.getCookies();获取到浏览器的cookie


谷歌浏览器可以点击感叹号查看本地的cookie有哪些


cookie原理

创建cookie流程:

  1. 客户端调用addCookie接口
  2. 服务端使用响应头将cookie信息返回给客户端
  3. 客户端获取服务器创建cookie信息保存到本地

获取cookie流程:

  1. 客户端调用getCookie接口
  2. 客户端使用请求头将cookie信息发送给服务端
  3. 服务器就可以通过req.getCookies();获取cookie信息

每次请求浏览器将cookie放入请求头,服务器从请求头获取cookie信息

session

如何创建session

@WebServlet("/addSession")
public class AddSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 默认为true,获取session,如果session不存在,就新建一个// 获取session,如果session不存在,则返回nullHttpSession session = req.getSession(true);session.setAttribute("name", "likeghee");resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("添加session成功");}
}

调用接口后,我们去看cookie

当前网站的cookie中多了一个JSessionId

如何获取session

@WebServlet("/getSession")
public class GetSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 默认为true,获取session,如果session不存在,就新建一个// 获取session,如果session不存在,则返回nullHttpSession session = req.getSession(false);String name = (String) session.getAttribute("name");resp.setContentType("text/html;charset=utf-8");resp.getWriter().write(name);}
}

F12查看请求头,客户端将sessionID传给了服务端

session原理

添加session:

  1. 客户端调用add接口,服务器调用req.getSession(true);服务器创建session
  2. 服务器通过响应头将sessionId返回给客户端

获取session:

  1. 客户端将本地的sessionId放入到请求头调用get接口
  2. 服务器调用req.getSession(false);服务器使用请求头中的sessionId去找到对应的值

边角料

我们可以看到sessionId的到期时间是浏览器关闭时,所以浏览器关闭,客户端再去调用get接口,服务器将无法从请求头中获取sessionId,也就无法获取到值。

同样的换一个浏览器也是查不到结果的,因为session的使用,用的是cookie的原理


为什么添加时getSession(true),而获取时getSession(false)?

如果我们将获取时的false改为true,客户端调用get接口,如果请求头没有sessionId,那服务器会创建session,这不是我们希望的,创建session应该是在add接口时使用


如果浏览器禁用了cookie,如何使用session呢?

sessionId就不通过cookie传递,使用缓存文件,我们自己用GET/POST表单将sessionId在服务器与客户端之间传递


session的值是存放在jvm中的,所以重启服务器,session值将会被销毁,一般做法是将值缓存到redis当中


集群session共享问题?


如何解决发布版本失效问题?

闭关修炼(二十二)session和cookie原理相关推荐

  1. 闭关修炼(十二) NIO

    Netty的前置学习 文章目录 NIO 什么是NIO 缓冲区 什么是缓冲区? ByteBuffer-HeapByteBuffer类源码解析 ByteBuffer例子 mark和reset mark例子 ...

  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试...

    最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...

  3. 【转载】 javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册 - 孤傲苍狼 - 博 http://www.cnblogs.com/xdp-gacl/

    javaweb学习总结(二十二)--基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+Ja ...

  4. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  5. 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........

    4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...

  6. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

  7. 实验二十二 SCVMM中的SQL Server配置文件

    实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...

  8. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

  9. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  10. 读书二十二载,信念很简单,把书念下去,然后走出去,不枉活一世。

    ‍ ‍ 关注+星标公众号,不错过精彩内容 昨天看了一篇关于博士论文的致谢,看的我想哭.改变命运有很多条路,但是对于大多数人而言,读书是改变命运的捷径. 内容是讲述了自己20多年的求学经历:小时候煤油灯 ...

最新文章

  1. java拍照搜题软件下载_修改版|学生福利!!免费拍照搜题秒出答案,扫一扫作业出答案!...
  2. TensorFlow 2.7 正式版上线,改进 TF/Keras 调试,支持 Jax 模型到 TensorFlow Lite转换
  3. 资深专家给.NET初学者的学习建议(转)
  4. js localdate上一个月_moment.js格式化日期,获取前一个月的时间
  5. android log耗性能吗,一个高性能的Android日志库
  6. 每日求一录~20170704
  7. antd table设置表格一个单元格的字体颜色_开源 UI 库中,唯一同时实现了大表格虚拟化和树表格的 Table 组件
  8. leetcode -39组合总数
  9. lambda 加和_流畅和稳定的API的Lambda
  10. java hive demo_java 操作hive通过jdbc
  11. wait 和 sleep 区别
  12. 学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV
  13. 力扣题目——1. 两数之和
  14. vos3000下载java_昆石VOS3000_2.1.4.0完整安装包及安装脚本
  15. laravel 判断字符串包含_Laravel:表单验证字符串长度的错误信息导致的异常
  16. 高级计量经济学及stata应用 学习笔记③ 长面板
  17. 【迁移学习】PointDAN: A Multi-Scale 3D Domain Adaption Network for Point Cloud Representation
  18. unity 转盘记录
  19. CSS齿轮转动加载动画
  20. 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示

热门文章

  1. 计算机视觉工具、代码合集
  2. KMP —— 字符串分析算法
  3. LeetCode LCP 19 秋叶收藏集 HERODING的LeetCode之路
  4. 基于乾坤的微前端+SpringBoot2.7整套解决方案的基础通用平台及组件
  5. 计算机编程中的草图,我每天都画草图,你也该试试看
  6. 操盘建议----全球顶尖交易员的成功实践和心路历程(三)
  7. 华尔街智商测试 交易员江平的答卷
  8. u-boot之u-boot-2009.11启动过程分析
  9. 8寸7寸触摸屏常见的故障问题和维修方法分别是什么?
  10. Windows 通过CMD指令导出的文件夹/文件的目录树