免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9856 | 回复: 12
打印 上一主题 下一主题

如何实现session功能? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-04-02 17:40 |只看该作者 |倒序浏览
目前正在用c写cgi程序,请问用c我该如何实现session功能呀?最好能给举例说明一下,很急,谢谢了!!!

论坛徽章:
0
2 [报告]
发表于 2003-04-02 20:48 |只看该作者

如何实现session功能?

用户一旦登陆成功,cgi就生成一个随机字符串,本地留一个存根后以cookie的形式发给浏览器。在需要session操作的时候,检查浏览器发回的cookie本地是否有存根,就知道他有没有登陆了。

发送cookie的方法是在Content-type声明之前:
printf("Send-cookie: var=随机串; expires=xxxxxxxx; server=xxxxxx; path=xxxxxxx; secure\n";
(expires,server,path分别是有效期、域名、url,secure是说明是否要在https连接时向服务器返回cookie。)

接受cookie很简单,读取环境变量即可:
strcpy(xxx,getenv("HTTPD_COOKIE");
(好像是这个变量名,不行的话自己去网上查查)
然后自己写个字符串处理函数,分解出需要的变量值即可。

论坛徽章:
0
3 [报告]
发表于 2003-04-03 09:47 |只看该作者

如何实现session功能?

十分感谢!我试试看!!!

论坛徽章:
0
4 [报告]
发表于 2003-04-03 09:59 |只看该作者

如何实现session功能?

对了,请问这个随机串是什么?是否就是登陆名?能否举例说明一下?由于从来没用c写过cgi,还请多指教,谢谢!!!

论坛徽章:
0
5 [报告]
发表于 2003-04-03 13:47 |只看该作者

如何实现session功能?

COOKIE机制不是太好,因为客户端情况变化太大。我以前所实现的是用URL带BASE64编码的SESSIONID信息来表明用户的SESSION ID,并且在主机里专门实现一个小型SESSION POOL。用于匹配用户的SESSION ID的其他关键信息,当然这种存放要考虑安全性,我用的是DBM库加密方式。
实现SESSION还要考虑一种情况:是单机还是多机的负载均衡,如过用了负载均衡设备,还要考虑得更周到一些

论坛徽章:
0
6 [报告]
发表于 2003-04-03 14:01 |只看该作者

如何实现session功能?

[quote]原帖由 "ccrazy"]对了,请问这个随机串是什么?是否就是登陆名?能否举例说明一下?由于从来没用c写过cgi,还请多指教,谢谢!!![/quote 发表:


必须是看上去毫无意义的字串,否则不安全。可以通过/dev/urandom生成,也可以通过crypt()计算出用户名+客户IP+连接时间戳的md5散列来生成。

论坛徽章:
0
7 [报告]
发表于 2003-04-03 14:08 |只看该作者

如何实现session功能?

[quote]原帖由 "chdonald"]COOKIE机制不是太好,因为客户端情况变化太大。我以前所实现的是用URL带BASE64编码的SESSIONID信息来表明用户的SESSION ID,并且在主机里专门实现一个小型SESSION POOL。用于匹配用户的SESSION ID的其他关键信息,当..........[/quote 发表:


没问题,我的cookie存根是放在数据库里的,与用户名和客户的IP相关联,均衡也不怕。用户注销后删除。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-04-03 14:27 |只看该作者

如何实现session功能?

用C实现Session机制确实比较麻烦, 必须在本地,或数据库中缓存SESSION数据. 还是Servlet方便,直接放在内存中

论坛徽章:
0
9 [报告]
发表于 2003-04-04 13:27 |只看该作者

如何实现session功能?

[quote]原帖由 "gadfly"]用C实现Session机制确实比较麻烦, 必须在本地,或数据库中缓存SESSION数据. 还是Servlet方便,直接放在内存中[/quote 发表:


C语言也可以利用共享内存的方法把存根放在内存里,之所以不这样做是为了解决上面chdonald提到的负载均衡问题。

你用servlet是怎么解决负载均衡的?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2003-04-04 15:08 |只看该作者

如何实现session功能?

我的意思是,如果用servlet并不用直接管理session数据,而是由servlet container自动完成管理。你如果用c 实现CGI,将session数据存入共享内存,用户总得在服务端实现这些数据的内存管理。

至于动态均衡,有种算法,是将最近访问过的ip,还是分配到以前的服务器。这可以解决这个问题,不过这是依赖于load balance,与实现无关了。

还有一些方法:

1 記憶體處理
當某台 J2EE Server 中的某個 HttpSession 有新增某個 Object 進去的時候,或是當這個 HttpSession 的某個 Object 被修改之後,這台 J2EE Server 可以利用 IP Broadcast 的方式,或是 TCP/Socket 的方式,將 Object 傳遞到其它備份的 J2EE Server 上,讓其他 J2EE Server 上相關的 HttpSession 也跟著變化。


2 由一台資料庫或是檔案系統記錄
這種方式是讓 HttpSession 內的資料,固定寫入到一台資料庫去,或是這幾台要作 Cluster 的 J2EE Server 共用一塊硬碟區,將資料固定寫入該硬碟區塊,如此一來,某台 J2EE Server 發生問題時, Session 的資料一樣還在。


3 集中式處理
所謂集中式的處理,與記憶體處理方式非常類似,但是 HttpSession 的資 料並不是送到多台機器上,而是被送到某台特定的機器上,當然,當另外一台機器要取得 Session 的資料的時候,也可以透過這台機器來存取!

以上1依赖于j2ee server, 2实际上存数据库的方法。3感觉上不可行,有单点
故障问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP