Session&Cookie&localStorage浅谈
Session&Cookie&localStorage
领导让我开发一个有两张信息表单需要提交页面的网站,我作为一名开发人员,这个需求太简单了,和领导说直接存session
session不是http的概念,而是服务器开发框架的概念,这些框架可以针对指定的用户开辟一块内存用来标识那个指定用户,也可以认为是对于我们公司给你的passport,一般session的过期时间是20分钟(以tomcat为例)超过这段时间用户必须重新请求并在服务器中重新生成一个新的passport.我想这样设计,用户填写完第一张表单可以存在服务器的session中,可以是redis也可以是服务器内存中,用户提交第二张表单时提交后,服务器判断这是第二张表单再和session中第一张表单一起交给服务器做后续操作,这样其他人就不可能读到刚刚那个用户提交的数据了,领导对我说,其实使用session有两个巨大安全问题让我再斟酌一下
Cookie这时我又想到了用cookie来实现,cookie是保存客户端的cookie键值对,请求携带cookie发送给服务器进行处理,cookie的过期时间是客户端决定的,默认cookie失效是直到浏览器关闭
回到需求上来,当请求进来时,服务器判断请求头的set-cookie为空,那样就认为这个是第一次用户请求,服务器就返给他一段sessionid,其实这个sessionid关联cookie,当这个用户再次请求页面后,他的浏览器就携带着服务器发给他的那段sessionid,在服务器端对这个sessionid做匹配,发现是我发给你的sessionid,这样这两张表单就可以分两次发送给服务器了,不同的人就会识别不同的sessionid了,领导又和我说还是有安全问题,他提出如果黑客修改了cookie,黑客就可以模拟其他用户id来传第二张表单的数据,其可以进行篡改和伪造,session和cookie是相辅相成的,所以这是session的第一个安全问题(可能有人会说二次加密可以解决问题,我认为加密是可行的,这样数据就不会被篡改)其二,如果我是黑客,写一个脚本循环带有空cookie的内容来请求,那服务器不得不开辟大段内存,造成服务器内存泄露的性能问题,或者随着业务增长访问量导致服务器内存中都是第一张表单的数据,最后服务器内存不足宕机了.当然session还是一个致命的问题,引入有状态和无状态
什么是无状态和有状态?
无状态:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息)
有状态:与其相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等
所以状态体现在我们请求的服务器的架构中,有状态情况下请求只能发给一台服务器,而无状态可以横向扩展,所以架构师们想要实现可扩展性必须舍弃框架中的session,或者实现一个的共享存储中,但要面对复杂业务的风险
url重写
通过 Cookie 的方式存储 Session 状态,只是其中一种方式。如果客户端禁用了 Cookie 的话,很多网站任然可以存储用户的信息。一种处理的方式是URL 重写,将 SesseionID 直接附加在请求地址的后面。另一种处理的方式是,使用隐藏自动的方式。就是服务器自动的在表单中,添加一个隐藏字段,以便在表单提交时,将 SesseionID 一起传到服务器,进行识别(通常是将重要信息头啊cookie啊什么的扔到请求头后面写url重写必须要有能解析url重写的机制)
隐藏表单域
(参数存放)参数是存放在请求html实体里的<input type="hidden">,因此没有长度限制,但是不支持 GET 请求方法,因为 GET 没有请求实体
以上cookie,session,url重写,隐藏表单域是目前4大会话跟踪技术
回到正题,当服务器挂了,运维人员对服务器进行重启,因为session是存在内存中而不是存在数据库中,导致所有的session都没了,此时有些用户开始发送第二张表单,因没有提交sessionid服务器就认为用户就是在提交第一张表单,从而导致提交失败,当然负载均衡的出现对这种机制也不是很友好,服务器a,服务器b,不知道提交到那个服务器数据了,有人说数据存数据库不就好了,我们知道从数据库到内存需要时间,这样反复的与数据库交互对服务器性能不是很好.
之后我向领导提出在提交第一张表单之后将表单数据提交到cookie中,等第二张表单提交时,再附加上第一张表单cookie的信息,这样就能避免中断也能提交数据,我认为这是一个完美的方案但是领导说还是有一个缺陷,第一次提交表单没有任何意义,提交只是额外渲染了第二张表单的视图,所以第一次请求就是一次对服务器的流量消耗.
这里就引入localStorage概念
localStorge其实就是本地的存储,其是html5引入的新概念,普通的一条cookie信息存储空间在浏览器只能是4k的大小,而localStorge一般是5M,其通过键值对来存储的,其本身是js下window方法下的一个对象,要注意的是遵循同源策略,即在不同浏览器或者网站或者ip或者协议或者端口是不能使用的
localStorage调用方法及属性
localSorage.key(1)返回当前对象index序号所设置的值,没有返回null
localSorage.setItem(key,value)设置值
localSorage.getItem(key)获取值
localSorage.remoteItem(key)移除
localSorage.clear全部清除
localSorage.length获取长度
localStorage的局限性
1.只支持高版本浏览器,而且各个浏览器大小不统一,IE需要IE8才支持这个属性
2.目前浏览器对localSorage的限定都为string类型,需要变量json要自行改变
var userEntity = {
name: 'tom',
age: 22
}; // 存储值:将对象转换为Json字符串
localSorage.setItem('user', JSON.stringify(userEntity)); // 取值时:把获取到的Json字符串转换回对象
var userJsonStr = localSorage.getItem('user');
userEntity = JSON.parse(userJsonStr);
console.log(userEntity.name); // => tom
3.本质是对字符串的读取, 存储容量过多会使得页面卡顿
4.不能被爬虫抓到
localStorage与sessionStorage区别
localStorage是本地永久存储,除非手动清理
sessionStorage其本身原理,方法和属性与localStorage一致,其是会话关闭后自动清除,会话指的是浏览器窗口(若使用Chrome的恢复标签页功能,seesionStorage的数据也会恢复)
将了那么多localStorage,其实并不安全,黑客可以注入js代码,获取其他用户的localStorge数据,发送到黑客本机,所以能不用就不用.
最后我回到需求的本质,领导让我开发两张信息表单页面提交,我直接用纯js渲染页面不就行了吗,第一张表单用户按下'下一步'按钮,隐藏第一张表单的内容,显示第二张表单数据内容,点击第二张表单的'提交'按钮,这样所有表单的数据就一次性提交成功了,两张页面只需要做一张就行了,也不会有安全隐患,只是对用户来说如果强刷了页面又要从第一张表单开始填起,领导看到我激动的样子,满头黑线,就这个需求就搞了半天,看来我升职加薪是无望了
Session&Cookie&localStorage浅谈的更多相关文章
- cookie,,session,cache,static 浅谈笔记
cookie:存在于客户端,每次请求伴随httpRequest 到达服务器端,Cookie内保存sessionId,服务器端就是根据Cookie中的SessionId找到用户的专有session , ...
- session与cookie的浅谈
cookie的用途: 当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为你浏览某个网页的时候,WEB 服务 ...
- ASP.NET中Session的个人浅谈
看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意 ...
- Cookie 数据浅谈
Cookie 是一些数据, 存储于你电脑上的文本文件中. 当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息. Cookie 的作用就是用于解决 "如 ...
- 分布式session个人理解浅谈
在分布式中,用户的session如何处理呢? 服务器中的原生session是无法满足需求的,因为用户的请求有可能随机落入到不同的服务器中,这样的结果将会导致用户的session丢失,传统做法中有解决方 ...
- 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...
- [转] 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- 浅谈cookie 和session 的区别
具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cooki ...
随机推荐
- Linux 线程实现机制分析(转载)
自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads ...
- windows下大数据开发环境搭建(3)——Scala环境搭建
一.所需环境 ·Java 8 二.下载Scala https://www.scala-lang.org/download/ 三.配置环境变量 SCALA_HOME: C:\scala Path: ...
- lnmp 是不是该吐吐槽
lnmp 提供提供了便捷 , 并且手也伸的挺长的,它已不仅仅是个服务器环境那么简单 作为服务器继承环境来讲,可能每个人的认知程度不一,总之用了它需要服从它的规则 但从个人感觉上,其埋的坑还是让人不适, ...
- 20191108-从零搭建基于Linux的RobotFramework框架
第一步:安装Centos7 64位操作系统 直接安装即可,不详述 第二步:yum下载wget yum update yum install wget 第三步:安装Python3 建议安装3.7,我在 ...
- Spring依赖配置详解
<properties> <junit.version>4.12</junit.version> <spring.version>4.3.9.RELEA ...
- Codeforces Round #421 (Div. 1) (BC)
1. 819B Mister B and PR Shifts 大意: 给定排列$p$, 定义排列$p$的特征值为$\sum |p_i-i|$, 可以循环右移任意位, 求最小特征值和对应移动次数. 右移 ...
- 括号匹配问题 —— Deque双端队列解法
题目: 给定一个只包括 '(',')','{','}','[',']'?的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可 ...
- 怎样获取全局对象 window
1. 使用window.self window.self === window; // true 2. 使用window.window window.window === window; // tru ...
- JMeter-03-元件的作用域与执行顺序
JMeter元件的作用域与执行顺序 元件的作用域 先来讨论一下元件有作用域.<JMeter基础元件介绍>一节中,我们介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样 ...
- 利用RabbitMQ实现分布式事务
实现要点:1.构建本地消息表及定时任务,确保消息可靠发送:2.RabbitMQ可靠消费:3.redis保证幂等 两个服务:订单服务和消息服务 订单服务消息可靠发送 使用springboot构建项目,相 ...