当前位置: 首页 > news >正文

cookie和session

大家好,我是IT修真院深圳分院第5期学员,一枚正直善良的JAVA程序员。

今天给大家分享一下,修真院官网JAVA任务5中,cookie和session的相关知识点

一、背景介绍
HTTP协议的无状态性

有状态

A:你今天中午吃的啥?

B:吃的大盘鸡。

A:味道怎么样呀?

B:还不错,挺好吃的。

无状态

A:你今天中午吃的啥?

B:吃的大盘鸡。

A:味道怎么样呀?

B:啊?啥?啥味道怎么样?

cookie和session存在的意义就是为了保存http协议客户端/服务器间的部分有用的状态

无状态加持cookie机制

A:你今天中午吃的啥?

B:吃的大盘鸡。

A:你今天中午吃的大盘鸡味道怎么样呀?

B:还不错,挺好吃的。

cookie并没有让http协议变得有状态,而是保留了部分有用的状态

cookie和session

假如一个咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来记录某位顾客的消费数量。有两个记录的方案

1、发给顾客一张卡片,上面用印章记录着消费的数量,一般卡片还有个有效期限。每次喝咖啡时,顾客出示这张卡片,店员就在卡片上盖个章。

2、发给顾客一张会员卡,会员卡上有唯一标识的卡号,每次消费时,顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。

顾客就相当于客户端浏览器,店员相当于服务器。方案一就是在客户端保持状态。也就是cookie;方案二是在服务器端保持状态,也就是session。

cookie

Cookie 是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器内存或用户本地硬盘(客户端)上的小文本文件(内容通常经过加密),它可以包含有关用户的信息。无论何时用户链接到服务器,Web站点都可以访问 Cookie 信息

session

Session机制是一种服务端的机制,服务器使用一种类似散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端里的请求里是否已包含了一个session标识--sessionID,如果已经包含一个sessionID,则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用(检索不到,可能会新建一个),如果客户端请求不包含sessionID,则为此客户端创建一个session并且声称一个与此session相关联的sessionID,sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串(服务器会自动创建),这个sessionID将被在本次响应中返回给客户端保存。

二、知识剖析
怎么应用cookie

学习cookie需要掌握的两个要点

1、cookie的发放和读取过程

2、cookie的常用方法(API)

cookie的发放和读取

cookie的发放是通过扩展HTTP协议来实现的,服务器端通过在HTTP的响应中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。利用HttpServletRespones的addCookie()方法将它设置到客户端

被该服务器设置过cookie的客户端之后的每次访问都会在请求头上携带该cookie的信息(只要在设置的路径范围内),利用HttpServletRequest的getCookie()方法来读取客户端的Cookie,返回一个Cookie数组

cookie的常用API及注意事项

1.Cookie有效期:使用setMaxAge()方法设置

2.Cookie有效域:setDomain(String domain)/getDomain()

3.Cookie有效路径:setPath(String uri)/getPath()

怎么应用session

学习session需要掌握的两个要点

1、理解sessionid

2、session的常用方法(API)

对sessionid的理解

sessionid是作为服务器识别客户端的手段而出现的,session是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户

sessionid的载体有三种:

1、使用cookie(默认、最常用)

2、URL重写的方式(针对cookie被禁的情况)

3、在页面表单里面增加隐藏域(和第二种的区别是它使用post)

session的常用方法(API)及注意事项

1、setAttrubute(String name,Object value)/getAttrubute(String name)

2、session.setMaxInactiveInterval();参数单位是秒

Cookie和Session之间的区别

1.Cookie数据存放在客户的浏览器(本地),session数据放在服务器上

2.Cookie不如session安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,所以出于安全性的考虑应当使用Session

3.Session会在一定时间内保存在服务器上。当访问增多,会占用较多的服务器资源,所以出于性能考虑则应当使用cookie

4.session因为是保存在服务器上,所以不支持跨域的访问

三、常见问题
1、配置服务器集群情况下客户端拿不到session的问题

2、相同域下sessionid覆盖的问题

四.解决方案
1、使用nginx负载均衡策略中的ip_hash设置,每个请求按访问ip的hash结果进行分配,这样可以使每一个访客固定访问一个后端服务器。
2、在web服务器的配置中可以修改自动分配的sessionid的key

五、编码实战

六、扩展思考
token
七、参考文献
1.CSDN博客:https://blog.csdn.net/cxzhq20...

2.师兄的PPT

八、更多讨论
Q1、 cookie存在本地的话会不会存在被篡改的风险?

答:不仅存在本地会,存在浏览器也会,cookie本身安全性就低

Q2、如果cookie被禁用了,session还能用吗

答:url重写或者表单隐藏域都可以让客户端请求携带上sessionid

Q3、 发送到服务器的请求会携带全部cookie吗?

答:不会,cookie本身会规定作用域的,在作用域以内才会被客户端携带

Q4、 cookie和localstorage有什么区别?

clipboard.png

Q5、介绍下session钝化机制

将服务器中不经常使用的Session对象暂时序列化到系统文件或是数据库系统中,当被使用时反序列化到内存中,整个过程由服务器自动完成

小课堂视频

PPT:PPT

感谢大家观看

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

相关文章:

  • Android EditText控件自动转换大小写,光标位置不跳位
  • Android aidl Binder框架浅析
  • 4.8_获取页面元素的内容_getTable
  • java框架学习日志-10(自定义类实现AOP)
  • 说一说飞机上的无线上网
  • C#中的线程池使用(一)
  • android实现图片识别的几种方法
  • 12月24日云栖精选夜读 | 刚刚,阿里开源首个深度学习框架 X-Deep Learning!
  • 微信智能开放平台
  • SqlServer如何获取存储过程的返回值
  • MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet http://my.csdn.net/21aspnet/message CSDN Five...
  • 梯度下降
  • ES7 ES8 的新特性(部分)
  • Android程序完全退出
  • P2-2017级算法第二次上机 B 女娲加农炮
  • 11111111
  • echarts花样作死的坑
  • Electron入门介绍
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript-Array类型
  • Javascript基础之Array数组API
  • js操作时间(持续更新)
  • Markdown 语法简单说明
  • NSTimer学习笔记
  • orm2 中文文档 3.1 模型属性
  • Rancher-k8s加速安装文档
  • SpiderData 2019年2月16日 DApp数据排行榜
  • uni-app项目数字滚动
  • 来,膜拜下android roadmap,强大的执行力
  • 如何优雅地使用 Sublime Text
  • 小程序开发中的那些坑
  • 7行Python代码的人脸识别
  • Prometheus VS InfluxDB
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • # 计算机视觉入门
  • #Linux(make工具和makefile文件以及makefile语法)
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (1)(1.11) SiK Radio v2(一)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (6)设计一个TimeMap
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (windows2012共享文件夹和防火墙设置
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)c52学习之旅-点亮LED灯
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)母版页和相对路径
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET使用存储过程实现对数据库的增删改查