日期:2014-05-17  浏览次数:20961 次

在session和cookie都不能用的情况下,用什么方法识别客户端是否登录??

由于域名转向的原因,session和cookie的值都会丢失,所以等用户登录以后,想要证明该用户是否已经登录,就变得很麻烦了。

我现在能想到的做法是:一旦登录,就将   Application( "user_客户端IP ")   =   "true ";注销,Application( "user_客户端IP ")   =   " ".只要Application( "user_客户端IP ")   = "true "就是登录状态。

带来的问题:
1.客户端IP不能保证唯一,会出现几个帐户用同一个ip的情况。
2.反复进行Application( "user_客户端IP ")操作,会占用很多内存。由于登录用户不多,这个问题可不用考虑。

您有没其他更好的方法,请留言。谢谢!!


------解决方案--------------------
asp的正常情况下,会执行以下步骤:

1、服务器接受连接请求,检查包头,没有AspSessionID这一项,则在自己的系统表里生成一个ID,SessionID,TimeOut项。

其中SessionID是随机唯一的字串,通过Response包头发回客户端,储存在内存Cookie中,客户每次Request都会自动加上这个包头。你可以通过抓包软件看到,形如ASPSESSIONID=xxxxxxx。

2、对于包头有AspSessionID的,在系统表里查找对应项,找不到是非法连接,找到则更新Timeout,此连接可访问所有对应ID的Session集合。

3、系统自动检查系统表,剔除TimeOut过期的项。

4、任何开启session页面都会自动执行上面的步骤。这个过程对于客户端和服务器是透明的,由ASP系统完成。

在asp.net中,可以通过Url重写打到以上效果,例如本来通过包头的ASPSessionID,由于没有cookie,只好存在页面中,通过Http://xxx.com/(ASPSessionID=xxxxxx)/default.asp的形式发送请求。这也是透明的,双方看不到。

========

要想在Asp中打到连接效果,就必须完全手工编写以上步骤。由于不是在IIS的层面操作,必须重写相当于驱动一样的数据库/系统表管理,URL重写,并且必须加在所有页面中。

LZ所用的办法Application( "user_客户端IP ")不可取,因为ASP不提供可靠的IP,而且容易重复和被伪造。

(其实Asp和.net的办法也都不可靠。通过伪造包头和数据,可以实现IP的同Session登陆,这个问题大概要等改HTTP协议才行。)

总之:

楼主最好不要涉及这个方面,直接要求客户端保证cookie就好了。
------解决方案--------------------
实现要点:
1)客户访问的时候在其随机生成一串字符
2)把这串字符保存在数据库中
3)这段字符做成参数,在不同的页面之间传递
4)检查传递的参数和数据库中的内容是否一致。