分享人:张泉良
1.背景介绍
2.知识剖析
3.常见问题
4.编码实战
5.扩展思考
6.参考文献
7.更多讨论
(1) HTTP 无状态
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
(2)Cookie
Cookie,中文名称为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)
(3) session
会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
(4) token
Token是一个用户自定义的任意字符串。在成功提交了开发者自定义的这个字符串之后,Token的值会保存到服务器后台。只有服务器和客户端前端知道这个字符串,于是Token就成了这两者之间的密钥,它可以让服务器确认请求是来自客户端还是恶意的第三方
(1)COOKIE机制
Cookie保存在客户端,只能保存字符串对象,不能保存对象类型,需要客户端浏览器的支持:客户端可以不支持,浏览器用户可能会禁用Cookie
通常是在服务器端创建的(当然也可以通过javascript来创建)
服务器通过在http的响应头加上特殊的指示,那么浏览器在读取这个指示后就会生成相应的cookie了
业务信息("key","value")
域和路径
请求和响应都把cookie信息加载到响应头中;依靠cookie的key传递
COOKIE常用API
Servlet API封装了一个类:javax.servlet.http.Cookie,封装了对Cookie的操作Cookie保存在客户端,只能保存字符串对象,不能保存对象类型,需要客户端浏览器的支持:客户端可以不支持,浏览器用户可能会禁用Cookie
public Cookie(String name, String value) //构造方法,用来创建一个Cookie
HttpServletRequest.getCookies() //从Http请求中可以获取Cookies
HttpServletResponse.addCookie(Cookie) //往Http响应添加Cookie
public int getMaxAge() //获取Cookie的过期时间值
业务信息("key","value")
public void setMaxAge(int expiry) //设置Cookie的过期时间值
Cookie visit = new Cookie("visit", "1")
(2) SESSION机制
每次客户端发送请求,服务器都检查是否含有sessionId。
如果有,则根据sessionId检索出session并处理;如果没有,则创建一个session,并绑定一个不重复的sessionId
状态信息保存在服务器端,通过类似与Hashtable的数据结构来保存,能支持任何类型的对象(session中可含有多个对象)
Session的工作原理
当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION. 在创建这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID, 如果包含了一个SESSION ID则说明之前该用户已经登陆过并为此用户创建过SESSION, 那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个), 如果客户端请求里不包含有SESSION ID,则为该客户端创建一个SESSION并生成一个与此SESSION相关的SESSION ID。 这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存, 而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。(1)、cookie 的使用场景
购物车:没有登录之前商品数据是保存在cookie中
记住用户名:利用cookie保存用户名
记住我 :利用cookie来保存用户名和密码(加密后保存的)
(2)、sessionid如何产生?保存到哪里
sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应 存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。 客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。(3)、什么场景适用于session?什么场景适用于cookie?
(1):session和cookie有什么区别?
1、存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比较艰难的. 而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等 ,可以把Session看做是一个Java容器类!
2、安全性的不同
Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,可以将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就没问题,反正是放在服务器上,
3、有效期的不同
使用记住密码的登录信息长期有效。用户不用每次访问都重新登录。网站会持久地记载该用户的登录信息。只需要设置Cookie的过期时间属性为一个很大很大的数字。 由于Session依赖于名为JSESSIONID的Cookie,而CookieJSESSIONID的过期时间默许为–1,只需关闭了浏览器该Session就会失效,运用URL地址重写也不能完成。 假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。
4、服务器压力的不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。 而Cookie保管在客户端,不占用服务器资源。假如并发使用的用户十分多,Cookie是很好的选择。
5、跨域支持上的不同
Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。 跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。
https://blog.csdn.net/weixin_37196194/article/details/55806366
https://www.zhihu.com/topic/19616699/top-answers
https://blog.csdn.net/weixin_37196194/article/details/55806366
欢迎大家讨论