闭关修炼(二十二)session和cookie原理
文章目录
- 简述
- 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流程:
- 客户端调用addCookie接口
- 服务端使用响应头将cookie信息返回给客户端
- 客户端获取服务器创建cookie信息保存到本地
获取cookie流程:
- 客户端调用getCookie接口
- 客户端使用请求头将cookie信息发送给服务端
- 服务器就可以通过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:
- 客户端调用add接口,服务器调用req.getSession(true);服务器创建session
- 服务器通过响应头将sessionId返回给客户端
获取session:
- 客户端将本地的sessionId放入到请求头调用get接口
- 服务器调用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原理相关推荐
- 闭关修炼(十二) NIO
Netty的前置学习 文章目录 NIO 什么是NIO 缓冲区 什么是缓冲区? ByteBuffer-HeapByteBuffer类源码解析 ByteBuffer例子 mark和reset mark例子 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试...
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
- 【转载】 javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册 - 孤傲苍狼 - 博 http://www.cnblogs.com/xdp-gacl/
javaweb学习总结(二十二)--基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+Ja ...
- 2021年大数据Hadoop(二十二):MapReduce的自定义分组
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...
- 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........
4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...
- iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)
iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...
- 实验二十二 SCVMM中的SQL Server配置文件
实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...
- 插入DLL和挂接API——Windows核心编程学习手札之二十二
插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
- 读书二十二载,信念很简单,把书念下去,然后走出去,不枉活一世。
关注+星标公众号,不错过精彩内容 昨天看了一篇关于博士论文的致谢,看的我想哭.改变命运有很多条路,但是对于大多数人而言,读书是改变命运的捷径. 内容是讲述了自己20多年的求学经历:小时候煤油灯 ...
最新文章
- java拍照搜题软件下载_修改版|学生福利!!免费拍照搜题秒出答案,扫一扫作业出答案!...
- TensorFlow 2.7 正式版上线,改进 TF/Keras 调试,支持 Jax 模型到 TensorFlow Lite转换
- 资深专家给.NET初学者的学习建议(转)
- js localdate上一个月_moment.js格式化日期,获取前一个月的时间
- android log耗性能吗,一个高性能的Android日志库
- 每日求一录~20170704
- antd table设置表格一个单元格的字体颜色_开源 UI 库中,唯一同时实现了大表格虚拟化和树表格的 Table 组件
- leetcode -39组合总数
- lambda 加和_流畅和稳定的API的Lambda
- java hive demo_java 操作hive通过jdbc
- wait 和 sleep 区别
- 学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV
- 力扣题目——1. 两数之和
- vos3000下载java_昆石VOS3000_2.1.4.0完整安装包及安装脚本
- laravel 判断字符串包含_Laravel:表单验证字符串长度的错误信息导致的异常
- 高级计量经济学及stata应用 学习笔记③ 长面板
- 【迁移学习】PointDAN: A Multi-Scale 3D Domain Adaption Network for Point Cloud Representation
- unity 转盘记录
- CSS齿轮转动加载动画
- 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示
热门文章
- 计算机视觉工具、代码合集
- KMP —— 字符串分析算法
- LeetCode LCP 19 秋叶收藏集 HERODING的LeetCode之路
- 基于乾坤的微前端+SpringBoot2.7整套解决方案的基础通用平台及组件
- 计算机编程中的草图,我每天都画草图,你也该试试看
- 操盘建议----全球顶尖交易员的成功实践和心路历程(三)
- 华尔街智商测试 交易员江平的答卷
- u-boot之u-boot-2009.11启动过程分析
- 8寸7寸触摸屏常见的故障问题和维修方法分别是什么?
- Windows 通过CMD指令导出的文件夹/文件的目录树