zoukankan      html  css  js  c++  java
  • Cookie和Session的区别

    转载自https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/90236289https://www.cnblogs.com/8023-CHD/p/11067141.html

    一、重要概念

    1.无状态的HTTP协议

    协议,是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器

    传送到客户端的浏览器。

    HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话

    2.会话(session)

    会话,指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

    二.Cookie

    (1)由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

    (2)Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。

    (3)当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

    (4)查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了(需要有网才能查看),JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容,如百度的网站的cookie显示,第一行BAIDUID是用户信息,百度网站使用算法进行加密处理了。

    1.会话cookie和持久cookie

    会话cookie:不设置过期时间,则表示这个cookie的生命周期为浏览器会话期间,关闭浏览器窗口,cookie就回消失,这种生命周期为浏览器会话期的cookie称为会话cookie,一般不保存在硬盘而是保存在内存里。

    持久cookie:设置过期时间,浏览器把cookie保存在硬盘上,关闭后再次打开,这些cookie仍然有效直到超过设定的过期时间,存储在硬盘上的cookie可在不同进程间共享,这种称为持久cookie。

    2.cookie具有不可跨域名性,就是说浏览器访问百度不会带上谷歌的cookie

    三、session

    seession是另一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端的信息以某种形式保存在服务器上,这就是session,客户端浏览器下次再访问的时候只需要从该session中查找该客户端的状态就可以了。

    每个用户访问服务器都会建立一个session,那么服务器是怎么表示用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个seeeionid。

    1.什么东西可以让你每次请求把session自动带到服务器呢?显然是cookie,如果你想为用户建立一次会话,可以在用户授权成功时给他一个唯一的cookie,当用户移交了表单时,浏览器会将用户的sessionid自动附加在HTTP的头信息中,当服务器处理完这个请求时,将结果返回给sessionid所对应的用户,试想,如果没有sessionid,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。

    2.储存需要的信息。服务器通过SessionId作为key,读写到对应的value,这就达到了保持会话信息的目的。

    3.session的创建

    当程序需要为某个客户端请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了sessionid,如果已包含则说明以前已经为此客户端创建过session,服务器就按照这和sessionid把这个的seesion检索出来使用,如果检索不到,则会新建一个,如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,它是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。

    3、禁用cookie:

      如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie。

    1)URL重写,就是把sessionId直接附加在URL路径的后面。

    2)表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如: 

    <form name="testform" action="/xxx"> 
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
    <input type="text"> 
    </form> 

      4、Session共享:

    对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间SessionId的共享。由于域名不同(aaa.test.com和bbb.test.com),而SessionId又分别储存

    在各自的cookie中,因此服务器会认为对于两个子站的访问,是来自不同的会话。解决的方法是通过修改cookies的域名为父域名达到cookie共享的目的,从而实现SessionId的共

    享。带来的弊端就是,子站间的cookie信息也同时被共享了。  

    四. 总结

    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

    2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

    6、cookie保存信息只能采用字符串形式,而session理论上可以是任何形式。

    五.应用场景

    • 登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
    • session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session
  • 相关阅读:
    HTTP协议
    JavaScript学习(一)
    Cookie&Session
    注解初学
    反射初学
    XML
    Web概念
    Response对象
    Servlet
    LeetCode Notes_#617 Merge Two Binary Trees
  • 原文地址:https://www.cnblogs.com/yuhuang/p/12881245.html
Copyright © 2011-2022 走看看