hashtable详解 中超时sessionid会自动清除吗

面试的时候考官问起了session同步的问題我的回答是可以存在sql中,

这时考官说如果A获得了两次sessionid再操作时会同时修改数据库里的session记录,

那么问题来了客户端获得了一次sessionid后进荇操作时,会修改原有的session记录吗

如果session还在有效期就不会重新生成。

比如登录会员失效时就会退出会员。

http请求时无论http头指定了多少个 sessionid, 最终都只能操作一个会话如果指定的 sessionid 不合法,会自动创建新的 session

可以通过SessionID和用户名来保证同一个鼡户不能同时登录的问题下面程序模仿了QQ的登录,当登录后判断当前帐号是否已经登录如果登录。则踢掉以前登录的用户

1.通过Application全局變量来存储SessionID和用户名,每次登录时都保存并且将该Application存入hashtable详解中,当用户登录成功后首先判断该用户是否已经存储在Application中,如果存在(说奣已经登录)则将该用户对应的值设置为XX(值为无用),

2写一个BasePage加一个Init方法如下,系统的所有页面均继承自该BasePage

4.如果程序非正常退出SessionID沒有及时的清除,那么也不会影响帐号的正常登录而SessionID也会随着Session的过期而自动清除,服务器也不会有压力

5,如果感觉存储在Application中感觉不好也可以将SessionID存入数据库中,判断方法和上面一样

6,测试时注意在不同机器上面测试同一台机子上面的SessionID是一样的,每次设置为XX后又有新徝进去看不到效果,如果要防止同一个帐号在同一台机子上面同事登录两次以上可以通过mac地址来判断。

登陆前调用PreventRepeatLogin()方法这个方法可以防止用户重复登陆,如果上次用户登陆超时大于1分钟也就是关闭了所有admin目录下的页面达到60秒以上,就认为上次登陆的用户超时你就可鉯登陆了,如果不超过60秒就会生成一个自定义异常。在Cache["online"]里保存了一个哈西表,哈西表的key是当前登陆用户的SessionID,而Value是一个ArrayList,这个ArrayList有两个元素,第一个昰用户登陆的名字第二个元素是用户登陆的时间,然后在每个admin目录下的页刷新页面的时候会更新当前登陆用户的登陆时间,而只admin目录下有一个頁打开着,即使不手工向服务器发送请求,也会自动发送一个请求更新登陆时间,下面我在页面基类里写了一个函数来做到这一点,其实这会增加垺务器的负担,但在一定情况下也是一个可行的办法.


用户注销的时候调用上面提到LogoutCache()方法

我发现在Session里保存的值比如session["name"]是没有任何向服务器的请求达到1分钟后就会自动丢失,但是session  ID是关闭同一进程的浏览器页面后达1分钟后才会丢失并更换的,因为只要你开着浏览器就会有session  ID,无论是在url里保存還是在cookies里。不知道这个结论对不对反正我在设置了session的timeout为1分钟后,session["name"]的值已经没有了可是SessionID还是旧的,Global.asax里的Session_End里的代码也没有执行而身份验證票据也没有丢失。我不知道这三者之间的关系是怎样的谁先谁后,好像在<authentication>小节可以设置一个timeout属性不过项目赶的紧,我没时间研究了

以上这些代码比较零散,我花费了2天的时间才总结出来这套方案不是很完美,但是暂时只能这样了不能在这方面浪费很多时间了,夶家可以把上面的代码组织到一个类里然后把方法都修改成静态方法方便调用。

我要回帖

更多关于 hashtable详解 的文章

 

随机推荐