如何读取cookie?
(包括建什么工程,
如何测试,麻烦好事做到底)

解决方案 »

  1.   

    http协议是非常强大的, 但它有个缺陷, 就是不能记忆. 解决办法就是使用cookie.
    cookie实际上是一个字符串, 它的格式是"Name=Value", 客户可以拒绝接受cookie, 所以要考虑周全, 不要过于倚赖它.
    TWebResponse的SetCookieField()和TWebRequest的CookieFields属性可以分别用来存取cookie.
    SetCookieField(Values: TStrings; const ADomain, APath: string; AExpires: TDateTime; ASecure: Boolean);
    Values是cookie的实际内容, 可以包括多个cookie.
    ADomain和APath用来限制cookie作用的服务器域和路径.
    AExpires用于指定cookie的生命期, cookie将在此日期后作废. 一般采取Now+天数的格式. 也可以通过设置一个过去的日期, 使cookie无效.
    ASecure一般设为False.
    使用实例: 用cookie纪录上次访问时间和访问总次数.
    New -> Others -> WebServerApplication  -> ISAPI/NSAPI Dynamic Link Library
    新建一个Action, PathInfo设为mycookie并在其OnAction中加入如下代码:
    procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var
      tmp: TStringList;
    begin
      Response.Content := Format('You have visited my web for %s times and the last time is %s.',
        [Request.CookieFields.Values['Count'], Request.CookieFields.Values['Time']]);
      tmp := TStringList.Create;
      tmp.Add(Format('Count=%d', [strtoint(Request.CookieFields.Values['Count'])+1]));
      tmp.Add(Format('Time=%s', [FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)]));
      Response.SetCookieField(tmp, 'your server', '', Now+30, False);
      tmp.Free;
      Handled := True;
    end;
    编译运行: http://<your server>/project1.dll/mycookie
      

  2.   

    实际上我的问题不是网络编程的问题,运行也不能采用: http://<your server>/project1.dll/mycookie
    方式。
    我在IE工具条上做了一个toolbar,我想让上面的按钮click事件读本机的cookie ,
    我的问题是如何用 delphi 写了个单机版的程序,读本机的cookie.
    还请大侠赐教。
      

  3.   

    搞了几天,终于有了点眉目,以下是我登录一个asp站点的delphi程序,使用了IDHttp控件和IDCookieManager控件,在delphi7(带indy9)+win2k pro调试通过。有不当之处请指正,如转载请注明作者:yannqi。1、网站asp程序:
    判断如果有cookie显示用户名和邮件;如果没有将获得的用户名和邮件写入cookie。
    <%
    if (request.Cookies("name")="" or request.Cookies("email")="") then Response.Cookies("name") = request("name")
            Response.Cookies("email") = request("email")
    Response.write(request("name")+","+request("email")+",写入cookie")
    else
    Response.write("Name:"+request.Cookies("name"))
    Response.write("<br>email:"+request.Cookies("email"))
    end if
    %>2、delphi form
    object Form1: TForm1
      Left = 258
      Top = 154
      Width = 650
      Height = 388
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object btnLogin: TButton
        Left = 256
        Top = 24
        Width = 75
        Height = 25
        Caption = '提交'
        TabOrder = 0
        OnClick = btnLoginClick
      end
      object edtUserName: TLabeledEdit
        Left = 0
        Top = 24
        Width = 121
        Height = 21
        EditLabel.Width = 50
        EditLabel.Height = 13
        EditLabel.Caption = 'UserName'
        TabOrder = 1
        Text = 'yannqi'
      end
      object edtPassword: TLabeledEdit
        Left = 128
        Top = 24
        Width = 121
        Height = 21
        EditLabel.Width = 25
        EditLabel.Height = 13
        EditLabel.Caption = 'Email'
        TabOrder = 2
        Text = '[email protected]'
      end
      object Memo1: TMemo
        Left = 312
        Top = 64
        Width = 321
        Height = 281
        Lines.Strings = (
          'Memo1')
        TabOrder = 3
      end
      object Cookies: TMemo
        Left = 8
        Top = 64
        Width = 297
        Height = 281
        Lines.Strings = (
          'Cookies')
        TabOrder = 4
      end
      object btnInfor: TButton
        Left = 336
        Top = 24
        Width = 75
        Height = 25
        Caption = '测试'
        TabOrder = 5
        OnClick = btnInforClick
      end
      object Button3: TButton
        Left = 416
        Top = 24
        Width = 43
        Height = 25
        Caption = '清空'
        TabOrder = 6
        OnClick = Button3Click
      end
      object http: TIdHTTP
        MaxLineAction = maException
        ReadTimeout = 0
        AllowCookies = False
        ProxyParams.BasicAuthentication = False
        ProxyParams.ProxyPort = 0
        Request.ContentLength = -1
        Request.ContentRangeEnd = 0
        Request.ContentRangeStart = 0
        Request.ContentType = 'text/html'
        Request.Accept = 'text/html, */*'
        Request.BasicAuthentication = False
        Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
        HTTPOptions = [hoForceEncodeParams]
        CookieManager = CookieMngr
        Left = 120
        Top = 96
      end
      object CookieMngr: TIdCookieManager
        Left = 152
        Top = 96
      end
    end3、unit1。pas
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, IdCookieManager, IdBaseComponent,
      IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;type
      TForm1 = class(TForm)
        http: TIdHTTP;
        CookieMngr: TIdCookieManager;
        edtUserName: TLabeledEdit;
        edtPassword: TLabeledEdit;
        btnLogin: TButton;
        Cookies: TMemo;
        Memo1: TMemo;
        btnInfor: TButton;
        Button3: TButton;
        procedure btnLoginClick(Sender: TObject);
        procedure btnInforClick(Sender: TObject);
        procedure Button3Click(Sender: TObject);
       private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.btnLoginClick(Sender: TObject);
    var
      s, s1: TStringStream;
      i: Integer;
    begin
      s := TStringStream.Create('');
      s1 := TStringStream.Create('');
      try
        s.WriteString('name=' + edtUserName.Text + '&');
        s.WriteString('email=' + edtPassword.Text);
        http.Request.ContentType := 'application/x-www-form-urlencoded';    try
          http.Post('http://localhost/cookietest.asp', s, s1)
        except
          http.Get(http.Response.Location, s1);
        end;
      //}
        Memo1.Lines.Text := s1.DataString;
    //下面的是显示cookies信息的代码
        Cookies.Clear;
        Cookies.Lines.Add(inttostr(CookieMngr.CookieCollection.Count));
        for i := 0 to CookieMngr.CookieCollection.Count - 1 do
          Cookies.Lines.Add(CookieMngr.CookieCollection.Items[i].CookieText);
      finally
        s.Free;
        s1.Free;
      end;end;procedure TForm1.btnInforClick(Sender: TObject);
    var
      s, s1: TStringStream;
      i: Integer;
    begin
      s := TStringStream.Create('');
      s1 := TStringStream.Create('');
      try
        http.Request.ContentType := 'application/x-www';
        http.AllowCookies:=true;
        try
          http.Post('http://localhost/cookietest.asp', s, s1)
        except
          http.Get(http.Response.Location, s1);
        end;
        Memo1.Lines.Text := s1.DataString;
        Cookies.Clear;
        for i := 0 to CookieMngr.CookieCollection.Count - 1 do
          Cookies.Lines.Add(CookieMngr.CookieCollection.Items[i].CookieText);
      finally
        s.Free;
        s1.Free;
      end;end;procedure TForm1.Button3Click(Sender: TObject);
    begin
    cookies.Clear;
    Memo1.Clear;
    end;end.