Chinaunix首页 | 论坛 | 博客
  • 博客访问: 859282
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类: Python/Ruby

2011-05-10 10:17:33

cookie是怎样工作的?

例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如path、domain、expires等进行了指定。

Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;
expires=Monday,01-Mar-99 00:00:01 GMT

上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。
这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。

此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传到指定的服务器上,而决不会跑到其他的如的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie太多,超过了系统所允许的范围,浏览器将自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。

说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。

session又是如何工作的?

    由于http是无状态的协议,你访问了页面A,然后在访问B,http无法确定这2个访问来自一个人,因此要用cookie或session来跟踪用户,根据授权和用户身份来显示不同的页面。比如用户A登陆了,那么能看到自己的个人信息,而B没登陆,无法看到个人信息。还有A可能在购物,把商品放入购物车,此时B也有这个过程,你无法确定A,B的身份和购物信息,所以需要一个session ID来维持这个过程。

   cookie是服务器发给客户端,并且保持在客户端的一个文件,里面包含了用户的访问信息(账户密码等),可以手动删除或设置有效期,在下次访问的时候,会返给服务器。注意:cookie可以被禁用,所以要想其他办法,这就是session。比如:你去商场购物,商场会给你办一张会员卡,下次你来出示该卡,会有打折优惠。该卡可以自己保存(cookie),或是商场代为保管,由于会员太多,个人需要保存卡号信息(session ID)。

session ID 一般保存在cookie中,或者放在URL上(若是禁用了cookie)

=======================================

nginx.conf可以设cookie,大致配置如下:

        userid         on;
        userid_name     __cust;
        userid_domain   ;
        userid_path     /;
        userid_expires  365d;
        userid_service  0;
    如果禁用了cookie,那么在同一个站点下,每次打开一个页面,都会建立一个session,那么可以做session共享,把session放在文件或是memcached里。登陆会有网易通行证,你一次登陆,到任何一个页面都不需要再次登陆,就这么来的,一般叫SSO(单点登陆)。

    为什么要考虑这个?做web服务器集群或负载均衡的时候,客户端访问可能会分到不同的机器,假如需要购物等,用户第一次访问页面1,分到后端的S1,然后打开页面2,可能会分到S2,在里面1用户购物车,2用户在支付,结果会出现用户个人购物信息全丢失,需要再次登陆的情况。所以需要把session 放到一个公共的地方,每次不同的页面查询这个session,当用户离开的时候销毁掉。

php.ini里相关设置

 

  1. session.save_handler = memcached
  2. session.save_path = abc:11213
  3. session.use_cookies = 1
  4. session.name = sid
  5. session.auto_start = 0
  6. session.cookie_lifetime = 259200
  7. session.cookie_path = /
  8. session.cookie_domain = .chinaunix.com
  9. session.serialize_handler = php
  10. session.gc_probability = 1
  11. session.gc_divisor = 1000
  12. session.gc_maxlifetime = 1440
  13. session.bug_compat_42 = 0
  14. session.bug_compat_warn = 1
  15. session.referer_check =
  16. session.entropy_length = 0
  17. session.entropy_file =
  18. session.cache_limiter = nocache
  19. session.cache_expire = 180
  20. session.use_trans_sid = 0
  21. session.hash_function = 0
  22. session.hash_bits_per_character = 5

还有个session.use_trans_sid = 0/1,这个和跨页传递session有关,具体请搜索“抛开cookie使用session-php中session不能跨页传递问题的解决办法如果浏览器出了问题或禁用cookie,这个就很有效了,或是干脆把cookie放到memcache,上边配置即是。
一个简洁的php实现(放memcached)

  1. <?php
  2. $user_ticket='0x0dksldsk2c.s'
  3. $memcache=memcache_connect(10.1.1.1,11211)
  4. $user=$memcache->get($user)
  5. if

  6. ?>

 简洁点总结如下:

cookie由server->client端,然后保留在client上下次请求中含有该cookie,这样就能记录http的一些状态了。比如登陆认证页面1,就能自动到认证页面2。

cookie 有生命周期,路径,domain的限制。
缺点,不够安全,容易被篡改

session,保存在server段,但id在cookie上,假如client禁用cookie,那么会在url添加id,然后发给server。

 

 

阅读(4746) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~