一般会在客户端存形如 SESSID=a3d3a6d8e21ba459f 这样的一条cookies记录
浏览器每次和服务器交互,都会把这个SESSID发送给服务器。
服务器拿这个值去和存放在服务器上的SESSION记录比较。
找到有效的SESSION记录就认为这个SESSION是有效的,找不到或者只找到已经过期的记录就认为这个SESSION已经失效。
后端服务器有两种基本的身份验证:
是基于Cookie的身份验证,使用服务器端的cookie来对每次请求的用户进行身份验证。
较新的方法,基于令牌Token-Based的认证,依赖于被发送到服务器上每个请求的签署令牌。
为什么基于令牌token-based的方式更好呢?理由如下:
跨域 / CORS: cookies + CORS 并不能跨不同的域名而基于令牌能够使用 AJAX 调用服务器,在任何域名下你都可以使用>
无态(代表服务器端可伸缩): 没有必要将会话保存,令牌 token 自己是一个自我包容的实体,包含用户各种信息,其他状态信息可以保存在cookie或客户端本地存储器中
CDN: 能够适用来自CDN任何应用部件(eg javascript, HTML, images, etc), 你的服务器只是一个 API
解耦: 你不必和一个特定的验证格式Schema绑定,令牌token 能在任何地方产生,这样的你的API可以在任何地方以同一种验证方式调用验证。
对移动Mobile友善: 当你在一个原生平台(iOS, Android, Windows 8, etc)时, cookies依赖于一个安全API,并不是好主意,因为你得和一个cookie容器打交道,而基于令牌则简单多。
CSRF: 因为你不依赖cookies, 你就不需要跨请求保护,(eg it 有可能来自 <iframe> 请求一个POST,需要重用一个存在的验证。)
性能:一个网络往返(如发现在数据库中的会话)可能会比计算的HMACSHA256验证令牌耗费更多时间。
登录页面不是一个特殊情况,如果你如果您正在使用量角器来写你的功能测试,你不需要来处理登录的任何特殊情况。
基于标准: 你的API能接受一个标准的 JSON Web Token (JWT) 这个标准后面有多个库包(NET, Ruby, Java, Python, PHP),许多公司支持(eg Firebase, Google, Microsoft) ,比如Firebase允许他们的客户使用任何身份验证机制,只要你使用预先定义的属性生成一个 JWT,并使用共享密钥签署,就能调用它们的API
登陆验证是网站的基本需求之一,通过登陆为用户展示特定的信息与页面,登陆验证可以保护用户的个人信息,避免遭到他人的篡改与破坏。通过在登陆时记录一个数据,然后在需要进行登陆验证的页面比较此数据,若数据与登陆时记录的数据相符,则通过验证,否则不通过验证。这要求此数据是稳定的,不随url的变化而改变。即本地存储的方法。
1Cookies:浏览器均支持,容量为4KB,默认生命周期为浏览器窗口,默认作用域为本目录
2Session:服务器端的存储。
3LocalStorage:HTML5,容量为5M,生命周期是永久,作用域为文档源级别,即同协议、同主机名、相端口。
4SesstionStorage:HTML5,容量为5M,生命周期为当前标签页,作用域是标签页级别
//设置cookie
documentcookie= 'name=xiaoyu'
//编辑cookie
documentcookie= 'name=desu'
//获取cookie某一项的值
functiongetCookie(name) {
var arr, reg = new RegExp("(^| )" + name +"=([^;])(;|$)");
if (arr = documentcookiematch(reg)) {
consolelog(documentcookiematch(reg));
return encodedURI(arr[2]);
} else {
return null;
}
}
开启了Session支持的服务器在客户端开始会话的时候,生成一个SessionID,并且在响应(Response)头(Headers)中的Set-Cookie字段设置一个Cookie,Cookie的内容就是SessionID和Cookie的路径(path),在后继的会话中,客户端浏览器会自动附上Set-Cookie中的SessionID以向服务器表明身份,服务器根据SessionID在自己的存储中查找相关用户信息,并完成验证过程。
那么用户登陆的过程也就是用户对服务器提交用户名、密码等信息,获取SessionID的过程。
两者用法相同:
//保存数据到sessionStorage
sessionStoragesetItem('key', 'value');
//从sessionStorage获取数据
sessionStoragegetItem('key');
sessionStoragekey;
//从sessionStorage删除保存的数据
sessionStorageremoveItem('key');
//从sessionStorage删除所有保存的数据
sessionStorageclear();
1cookie始终在服务器和浏览器之间来回传送,明文传递,不够安全,且占用了带宽。数据大小受限,只有4kb,对cookie的 *** 作也比较繁琐。
2session保存在服务器端,数据安全。对数据的 *** 作需要后端协助。
3localStorage,永久存储且可存入大量数据,但如果数据过多,打开浏览器时会比较卡。4sessionStorage,生命周期和作用域都比较窄,这是优点也是缺点。
1参考一: Javascript本地存储小结
2参考二: Session和Cookie的区别及Session的生命周期
根据特性使用,若需要永久存储,则选择localStorage,若需要关闭网页就销毁数据,则选择sessionStorage
不是,虽然cookie有着诸多缺点,但cookie也有许多不可替代的特性,比如可以灵活的设置过期时间,也可以设置作用域。能在服务器和客户端进行数据交互。
Webstorage不会传递到服务器端,且webStorage就是为了解决cookie频繁在服务器和客户端交互的弊端而设,webstorage就是为了在客户端存储数据而生,不应舍本逐末。
01
它们分别是什么?
session:
session的中 翻译是“会话”,当 户打开某个web应 时,便与web服务器产 次session。服务器使 session把 户的信息临时保存在了服务器上, 户离开 站后session会被销毁。这种 户信息存储 式相对cookie来说更安全,可是session有 个缺陷:如果web服务器 做了负载均衡,那么下 个 *** 作请求到了另 台服务器的时候session会丢失。
cookie:
cookie是保存在本地终端的数据。cookie由服务器 成,发送给浏览器,浏览器把cookie以kv形式保存到某个 录下的 本 件内,下 次请求同 站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加 了 些限制确保cookie不会被恶意使 ,同 时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径, 般设置为全局:"")、失效时间、安全标志(指定后,cookie只有在使 SSL连接时才发送到服务器(>你懂数据库不,往session里面放的这个UserBean里面一般存有用户名、或id等唯一标志的东西,所以不会和其他的UserBean对象重的,这跟数据库里的主键有点类似,不会有重复记录。
但是,你在同一台机器上,用同一个用户名密码,打开多个浏览器,登陆同一个网站,这样服务器端也是保存这个sessionsetAttribute("User", UserBean),下一次的会把上一次的重新改写掉。
session在服务器端判断的,这个东西对同一段时间同一台机器的多个不同浏览器来说,是同一个session(这也就是为什么你登陆了比如当当网,然后你再直接开当当网其他网页会发现已经登陆了)。
多说一句,session是servlet里比较深奥的东西,你其实想了解更多session的机制,可以多查查资料,其实session判断不同用户用的是sessionId这个东西,它有两种实现方法实现判断,客户端cookie和url重写,作用是一样的。
对于补充的问题,要区分以下两点:
1)因为session是服务器端的对象,放得多了会导致服务器端的内存占用过大,往session中存放大量信息,不一定导致每次浏览器与服务器之前的通讯数据会增大,这不一定,服务器会变慢。
2)浏览器与服务器之前的通讯数据是否会增大,这是由request, response这些负责通讯的对象所带数据决定的,一般是看request的参数(post, get)的多不多来决定的,太多也会导致服务器反应变慢。
两者的机制是有区别的,后果都是致服务器性能下降。
最后建议,除了跨越多个页面的,如用户信息这些内容的,都不要用sessionsetAttribute,优先考虑用requestsetAttribute
如何为null 说明没有登录,否则已经登录,当然你登录成功的时候必须
sessionsetattribute("currentUser",user ) 把当前用户保存到session会画总
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)