web是基于tcp通讯的,自己写了个简单的web服务端,就是处理浏览器发来的报文,处理静态页面和动态页面,
有个问题不是很明白,session里面的值,是存在服务端的么?如果是的话,每次浏览器接收完消息都会断开tcp连接,再发生其他数据才又连接上,说明session也存在本地吧?否则服务器怎么知道session是否过期呢。
每次关了浏览器,session就失效了,不关的话,tcp也是断开的,对服务器端来说,关不关应该他都可以理解成断开了连接啊。

解决方案 »

  1.   

    session数据是存在服务器端的。服务器会产生一个sessionid,客户端接收这个id,并且在随后的请求中每次都附着提交这个id,服务器判断,有这个id的请求,就视作一个会话。sessionid一般是以临时cookie(浏览器进程内有效,不保存到文件,关闭再开无效)或者隐藏表单、querystring等方式保存和在服务器/客户机之间交换。不同的web server会话跟踪机制略有不同。具体可以google:web server会话跟踪。
      

  2.   


    如果你说的是那个图形验证码,稍微靠谱点的网站都是这么设计的——如果你提交验证结果,那么它和session中的比较,如果不一致,则重新在session中随机产生一个新的验证码,并且将图片回传。所以,你得到sessionid也不应该允许你反复试同一个验证码。但是,如果仅仅是登录验证,然后将验证成功信息登记在session里面,只要你获得sessionid(asp.net默认是放在临时cookie中,你可以抓包看到这一点)就可以实现模拟浏览器登录了。
      

  3.   

    如果你学习asp.net,那么先使用一个http调试工具看看浏览器跟web服务器之间传送的消息内容。你可以看到cookie是何时、怎样来实现SessionID的。
      

  4.   

    asp.net根本无法及时知道Session是否过期。它为每一个Session都记录最后访问时间,默认是20分钟,然后每当任意客户端请求到来时都去遍历所有Session、清除超过20分钟的Session集合。比如说一个很少人访问的网站,对于某一个Session,假设在47分钟之后才有一个客户端访问(不管是这个会话自己的还是别的会话的访问),此Session在这个最后访问47分钟之后就被自动从asp.net进程所占用的内存中自动清除了。不过其实在商用/租用的服务器上,服务器拥有者为了避免一些垃圾网站影响整个服务器出租,往往设置了IIS回收进程池的时间(例如每当200个访问之后就自动回收、内存占用达到70%时就自动回收、CPU占用超过5%时就自动回收,等等)。因此Session集合其实经常随着进程重启而“丢失”,而根本等不到20分钟/47分钟这么久就自动丢失了。