session的机制

Session其实就是根据登录的用户名来生成一个随机的Session ID, 然后将这个Session 名称作为cookie名字,Session ID及其值做为属性放入该cookie,发送到client端(php中默认实现时如此,cookies内存cookie, 当然可以进行设置更改cookie的类型),以后client与server之间通讯根据cookie的session id来判断用户是否合法!!

服务器上,Session不仅有Session ID, 也可以加入其它的属性如设定username='xxx';
当从client端访问服务器时,首先进行Session ID的匹配,然后使用$Session[username], 就可以把当前连接的username取出来。如果Session ID没有匹配,则无法取出username.

Session ID有失效期,cookie也有失效期,两个要配合。

生成随机的Session ID算法已经被服务器端实现了,如PHP,JAVA均有相应的算法。

内存cookie,是指没有设在cookie的Expires的属性,此时cookie将停留在客户端的内存中,只有在该IE窗口中从“文件-新建- 窗口”打开的新的IE窗和由form的target属性为_blank产生的新的IE窗口才共享同一个cookie信息。IE,Chome的选项卡都共享同一个cookie信息。

如果客户端禁用cookies,我们怎么办? 解决办法是在服务器端,使用php等将Session ID写到html页面上(并隐藏起来),当客户端请求新页面时,就将当前页面中的Session ID加在URL中作为参数,服务器端进行解析处理就可以使用Session机制了。

参考资料: http://blog.csdn.net/luojihaidao/article/details/3966921
关于session的。 
为什么使用session?使用session的根本原因是? 
假如你使用的编程语言没有提供对session的支持,请你使用伪代码实现session机制。 
请说明在你实现的机制中的安全因素。 
假如要让你的机制实现多个web服务器前端(几多个机器),你要怎样实现?假如要让你的机制实现勿单点故障点(即一台机器当掉,不影响整个系统的运行),你要怎样实现? 
1 为什么使用session?使用session的根本原因是? 
session是为了维持客户端和服务器的会话,实际上就是通过这个机制,来判断当前访问的用户,是上次的那一个?也就是身份的辨认。 
2 session的机制和实现 
session一般通过cookie或者URL里的一个参数来实现。 
第一次访问,产生一个唯一的session编号,然后发送给客户端,比如传递cookie,或者在url里面加上额外的参数 
服务器在一个Map里保存此编号对应的信息 
用户下一次访问,会再次传递这个编号,服务器在map里查找对应编号的信息是否存在,并进行后面的操作。 
3. 请说明在你实现的机制中的安全因素。 
最关键的,就是sessionid 的生成算法,要足够的随机性,且长度足够长。 除非不得已,不要放在url里面传递 
4 多个机器 
这个是集群的基础,session至少要在另一个机器上保持同步,也就是这个机器的某个session的任何改变,都要在另一个机器上同时改变。 当然,如果所有机器都改变也行,不过网络流量大了一些毕竟2个机器同时出故障的几率已经很低了。 
同步的机制可以用消息的方法进行,比如JMS/UDP等。如果同步有问题,则必须尝试,除非系统只剩下最后一台机器了。
5 故障恢复 
因为有至少一个session的备份,所以故障后应立即让备份的机器接管,并继续服务,同时让另外一个机器再次作为备份。 
系统如果有管理机,则可以实现简单的故障切换,否则只能每个session进行整个集群的备份了,这样任何一个机器接管都没有问题了。 
session这个东西不错,其实如果真的某个session故障了,如果不是关键应用,让系统rollback 然后重新开始,也是一个很有效并且可以接受的方案。 
对不起,系统忙,请稍后重试,然后就链接到另一个机器了,继续提供服务了。
参考资料2: http://www.jb51.net/article/8518.htm
Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 session 才是最方便的。 
  Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 session ID。 
  如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 session 生存期的角色。 
  我们来手动设置 session 的生存期: 
复制代码代码如下:

  session_start(); 
  // 保存一天 
  $lifeTime = 24 * 3600; 
  setcookie(session_name(), session_id(), time() + $lifeTime, “/”); 
  ?> 

  其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用: 
复制代码代码如下:

  // 保存一天 
  $lifeTime = 24 * 3600; 
  session_set_cookie_params($lifeTime); 
  session_start(); 
  $_session["admin"] = true; 
  ?> 

  如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。 
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值