最近用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=/....