2011年6月20日

    最近用Delphi2010自带的Indy10里的TidHttp做点东西,发现用它提交内容后,服务端无法保持Session。我们知道,当浏览器等向Http服务器提交内容后,服务器就会创建一个Session保存一些这个客户的东西,在Session未过期之前这个客户端一直能访问这个Session,但是用D2010的idHttp提交内容,每次服务器都会给它创建一个新的Session。在以前的Indy9,只要设置idHttp的AllowCookies属性,服务端就能保持这个Session,但indy10怎么设都不行,这可能是indy10的一个Bug。后来研究发现,它提交给服务端时,Http头里少了Cookie一项,原来当客户端第一次提交数据时,Http服务器会在返回的响应头里加一项Set-Cookie,这是这个客户端在服务器里的标识(SessionID),当客户端再提交时,把这个标识加到请求头中,这样服务端就知道哪个客户端对应哪个Session,如果没有,服务端就会认为是第一次连接,又会新建一个Session。知道原因后就好办了,下面是解决代码:

在窗体的private中加入一个变量,用于保存Session标识:

FCookie:String;

提交的代码(Http即TidHttp):

Http.Request.CustomHeaders.Clear;

Http.Request.CustomHeaders.AddValue('Cookie', FCookie);//自己增加Cookie项

Http.Post(xxx, xxx);//提交

str := Http.Response.RawHeaders.Values['Set-Cookie'];

if str <> '' then//第一次请求时返回的Set-Cookie不为空

FCookie := Copy(str, 1, pos(';', str) - 1);//去掉返回值分号后面的内容,般为 path=/....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值