1. Session、Cookie是什么
1.1 概念理解
要了解session和cookie是什么,先要了解以下几个概念 。
1.1.1 无状态的HTTP协议
协议:是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则 。
超文本传输协议(HTTP):是一种通信协议,它允许将超文本标记语言(html)文档从Web服务器传送到客户端的浏览器 。
HTTP协议是无状态的协议 。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接 。这就意味着服务器无法从连接上跟踪会话 。
文章插图
1.1.2 会话(Session)跟踪
会话:指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买 。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话 。常用的会话跟踪技术是Session与Cookie 。Session通过在服务器端记录信息确定用户身份,Cookie通过在客户端记录信息确定用户身份 。
1.2 Cookie
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份 。用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了 。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证 。这样服务器就能从通行证上确认客户身份了 。这就是Cookie 的工作原理 。
Cookie实际上是一小段的文本信息 。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie 。客户端会把Cookie保存起来 。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器 。服务器检查该Cookie,以此来辨认用户状态 。服务器还可以根据需要修改Cookie的内容 。
1.2.1 会话Cookie和持久Cookie 若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失 。这种生命期为浏览器会话期的cookie被称为会话cookie 。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的 。
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间 。存储在硬盘上的cookie可以在浏览器的不同进程间共享 。这种称为持久Cookie 。
1.2.2 Cookie具有不可跨域名性
就是说,浏览器访问百度不会带上谷歌的cookie
1.3 Session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上 。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session 。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了 。每个用户访问服务器都会建立一个session并自动分配一个SessionId,用于标识用户的唯一身份 。
1.3.1 两个问题
1)如何在每次请求时都把SessionId自动带到服务器呢?
那就是cookie了,如果你想为用户建立一次会话,可以在用户授权成功时返回一个唯一的cookie 。当一个用户再次发起请求时,浏览器会将用户的SessionId自动附加在HTTP头信息中(这是浏览器的自动功能,用户不会察觉到,开发人员也不需操作),当服务器处理完这个请求后,将结果返回给 SessionId 所对应的用户 。
2)储存需要的信息 。
服务器通过SessionId作为key,读写对应的value,这就达到了保持会话信息的目的 。
1.3.2 Session的创建
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了sessionId,如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionId把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionId,则为此客户端创建一个session并且生成一个与此session相关
联的sessionId,sessionId的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存 。
1.3.3 禁用cookie
如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie 。
1)URL重写 。就是把sessionId直接附加在URL路径的后面 。
2)表单隐藏域 。服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionId传回服务器 。
比如:
<form name="walking-form" action="/xxx/xxx"><input type="hidden" name="JSessionId" value=https://www.isolves.com/it/cxkf/yy/JAVA/2019-09-26/"NaOw3vjFW75aKnsF2C2HmdnV9LZcEbzWoWiBdHnLerjQ99zmpQng!-142002807">
推荐阅读
- Python完整代码带你一文看懂抽样
- 提升Java开发效率必看!教你如何在MyEclipse中使用内联搜索
- Web前端和Java开发哪个薪资更高,发展前景更好?
- 夏天,以“热”逼寒毒,不贪二凉,坚持三勤,给秋冬健康打下基础
- 乌龙茶分类大全乌龙的必备基础知识
- 一文看懂Oracle 数据库物化视图和物化视图日志
- 如何用JavaScript创建弹出窗口
- 帮你理清楚Java反射应该如何写
- Java性能之优化RPC网络通信
- Java 程序员需要用到 10 个测试框架和库