用asp.net的高层api写过很多web,但是对session和cookie一直属于半懂不懂的状态,这几天啃了点,总结一下,不对的地方大家指正。
关于session:这个东西应该不是一个通用的产物,只不过各种服务器端技术都包括了这个,servlet有、asp有、asp.net有、php也有,原理大概相同。
关于cookie:这个应该算是一个标准了,各个浏览器都支持标准的cookie,js支持cookie的读写。
session,字面理解,叫做会话,或者我们经常叫它会话状态。简单说,他记录当前会话过程中的一些状态,最常用的就是用户登录、购物车这种了。
session什么时候建立,什么时候消失:默认情况下,在你向服务器发出某个请求后,服务器认为需要session了,就建立了它,至于消失,要么你给服务器的某个请求要求它删除,或者等待session过期自动删除。
在客户端来讲,session通常都是存在cookie中,这cookie也有两种,一种是临时cookie,保存在浏览器进程中,关了浏览器cookie就消失了。一种是持久性的,保存在本地文本文件中。
要注意,关闭浏览器,只能删除本地的临时cookie,并不能删除服务器中的session,因为你关闭了浏览器,服务器并不知道。服务器只能认为这个session多久没有活动了,就认为它过期而删除它,甚至你不关闭浏览器,只是长时间不操作(不发请求),那么服务器也会认为session过期,也就是你登录了某网站经常不操作,再操作的时候就会让你重登录的原因。
说session通常存在cookie中,并不是总是存在cookie中,只是有的时候cookie被浏览器禁用了,那么你需要把session挂到url后面的参数里。
cookie比较好理解,和服务器无关,完全就是存在本地的,不过服务器可以取到这个东东,从http的请求头里,也可以设置它,同样在http头里面。
session就相对比较复杂了,至少session仅仅依靠服务器或者仅仅依靠客户端搞不定,这个东西需要两方面配合,session中的东西可以是简单数据,也可以是对象,那么是不是这些对象都存在cookie中,不是!
cookie只保存session_id,也就是这个session的标示,真正的session内容存在服务器里,否则那么大一个对象传来传去,吃不消的!
上面所说的cookie和url后面跟着的session其实也就是session的id,这个id不能是简单的数字,比如1、2、3,否则,你可以很容易猜到别人的session_id,而冒用别人的会话。所以通常这种值都是散列的,也就是一大堆乱码,反正你是无法直观得到它的规则的,而服务器也是根据一个当前的随机数产生的这个序列,你猜不到。不过有一种xss攻击可以让你访问一个网页,执行一个js,然后盗用你的session_id,比较危险。
session是不必非要可序列化的,因为是服务器保存的,至少java中如此,.net中还没有试验过。viewstate通常用于保存当页在回发前后的状态,由于存在页面的隐藏表单里,是文本流形式,所以必须序列化。
session在服务器通常保存在服务器进程里,使用session的访客越多,你的服务占内存越多,重启这个进程(在iis6.1-iis7中叫做应用程序池),session就没了。不过iis中可以设置保存在别的地方,比如sqlserver,这么做的好处我想在集群的时候能体会到,或者服务器干脆不删除你的session,不过这也会带来一些麻烦。
很多时候,我们可以不用session而用cookie,我感觉这倒有点不用服务器端框架的api而自己写api的意思了,怎么用方便自己拿捏。