session 原理

来源:互联网 发布:金小桃 大数据 编辑:程序博客网 时间:2024/04/27 17:38

不得不说当我了解了session的原理之后感觉到了惊讶,因为session竟然是基于cookie的,所以当一向被认为不安全的cookie和超安全的session等同之后确实很让人接受不了,因为我确实是菜鸟
做了这么多年的web,用了这么多年的session和cookie,竟然就习惯了这两个东西,把他们的功能当成了天然的功能,从来没有考虑过他们的原理,实在是悲哀,直到有一天,我觉醒了。。
首先应该了解http协议的请求过程,这个以前倒是知道,当然是基于tcp/ip协议,客户端请求服务器,服务器回答客户端,无状态的,那么服务器如何区分客户端的呢?看完本文自然明白了

关于cookie

先来说cookie,怎么使用就不说了,cookie按照在客户端存放的方式,可以分为两类,
一种是会话性质的cookie,存放在浏览器内存中,当你在用代码向客户端写入cookie的时候,如果没有指定过期时间,那么cookie是存放在浏览器的内存里面的,不会持久化在硬盘上,也就是你在浏览器的临时文件里找不到!
一种是持久化的cookie,存放在硬盘上,当你指定了cookie的过期时间,那么,在客户端写入cookie的时候就会在浏览器的临时文件下生成一个文件,具体格式和名字可以到浏览器临时文件去看下

cookie的原理是这样的:当你在服务器端的代码里写了response.cookie["mycookie"]="mytestcookie"的时候,返回给客户端的http响应中,会在http相应头中加入cookie的信息,浏览器收到相应后,会按照http响应头里的cookie在客户端建立cookie。
客户端的cookie也是插在http头中发送到服务器端的,并且,一个域,在客户端建立的所有cookie,在客户端的每一次的http请求都会带着,比如testwebsite.com这个站点,任何时刻写到客户端的cookie,只要不过期,浏览器在向testwebsite.com发送http请求的时候,会带上这些cookie,所以cookie在客户端的大小是有限制的

关于session
cookie明白了之后session就容易理解了,asp的session和asp.net默认的session就是通过第一种cookie来实现的,你可以把自己的浏览器的cookie彻底禁用,然后再去登录一些注册过的门户网站,会发现很多都登录不了了。是cookie,将http的请求变得有状态。session的实现是web服务器的事情,不过很显然是利用会话cookie,也就是存放在浏览器内存里的那种cookie来实现的,在cookie里只是存放了SessionID,然后在服务器上建立了一张表,对应客户端的SessionID。这张表是存放在服务器上的进程中的,也就是服务器的内存里,也就是Application里。当客户端请求服务器的时候,如果服务器发现这是一个新的请求,就会分配给他一个SessionID,也就是在浏览器写入一个sessionID的cookie。你可以试一下,在你请求过一次服务器之后,在服务器遍历客户端所有的cookie,就会发现这个叫做SessionID的cookie。
所以在了解了这个session的原理之后我们可以自己来造一个自己的session,过程就不说了。

那么我们现在可以说session就是依赖于会话性的cookie的

关于session的其他
asp.net可以定制session的实现方式,默认是上面说的原理,但是可以改变的。
可以选择不依赖于cookie,就是把sessionID作为URL的一部分放在每一次的请求后面,像这样:
http://www.testwebsite.com/(-此处为一串sessionID的字符串-)/test.aspx
但是这种方式你如果在html中指定url的时候,指定了绝对路径,比如
<a href="http://www.testwebsite.com/other.aspx">test</a>
那么点击这个链接就会不是同一个会话了,因为此时区分客户端的唯一标志就是域名后面那串字符串
php也有类似的做法,不依赖cookie的做法是在get的参数里面带一个sessionID的参数
asp.net还可以定义session里存放数据的存储位置,放在其他进程,放在sqlServer中等等,知道了session的原理就很容易明白,我们可以自己就可以造一个类似session作用的东西的

session的结束问题

还有知道了session的原理就会明白一个session会话如何结束,除非服务器端可以清除一个session会话,客户端是没有能力清除session的,关闭浏览器的时候并不能够结束当前的会话(忽略浏览器关闭事件),在不依赖于cookie的session中最明显,你可以记下你的sessionID那串字符串,关闭浏览器,打开,把sessionID自己替换,你就可以恢复刚才的会话了。所谓的20分钟session超时,是服务器每隔20分钟对于不活动的session清除而已。
还有要指出的是依赖于cookie的session是存放在浏览器内存中的,所以一个浏览器的进程就会产生一个session,可以通过任务管理器查看进程,对于IE来说,只有双击桌面上的浏览器快捷方式才能新启动一个进程的,当然其他类似启动iexplorer.exe的行为也可以

到这里你会发现在依赖于cookie的session中,是需要浏览器的支持的!所以当你不用浏览器而自己来制造http请求的时候,session就用了!
对于js的ajax请求,确切的说是xmlhttp这个组件发送的http请求,虽然是你使用js的代码自己制造的,但是依然是借助于浏览器发送的,所以可以获得session。
所以在webservice中使用session我们还得自己造一个东西实现cookie的功能