代码之家  ›  专栏  ›  技术社区  ›  kuni255

将Cookie字段添加到发布请求的标题

  •  2
  • kuni255  · 技术社区  · 9 年前

    我想发送如下的帖子请求,程序是用delphi编写的。 Reuquest of web browser 请求头中有一个cookie字段(红色矩形)。 我编写了以下源代码。

    procedure TForm1.Button2Click(Sender: TObject);
    var
        uri : TIdURI;
        cookie : TIdCookieManager;
        HTTP : TIdHTTP;
        vals: TStringList;
        url : String;
        response : TStringStream;
    begin
        HTTP := TIdHTTP.Create();
        HTTP.AllowCookies := True;
        HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
        HTTP.HandleRedirects := True;
        cookie := TIdCookieManager.Create();
        uri := TIdURI.Create('www.hoge.com');
        cookie.AddServerCookie('ASP.NET_SessionId=test', uri);
        HTTP.CookieManager := cookie;
        vals := TStringList.Create;
        response :=  TStringStream.Create('');
        vals.Add('__EVENTTARGET=');
        vals.Add('__EVENTARGUMENT=');
        vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A=');
        vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C');
        vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg==');
        vals.Add('ddlLanguage=ja-JP');
        vals.Add('tbUserId=myid');
        vals.Add('tbPassword=hoge');
        vals.Add('btnLogin=login');
    
        url :=  TIdURI.ParamsEncode('ReturnUrl=/GssNet/main/default.aspx');
        url := TIdURI.URLEncode('www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx');
        try
            HTTP.Post('http://www.hoge.com/GssNet/login,aspx', vals, response);
        Except
            on EIdHTTPProtocolException do
            begin
              ShowMessage(Memo1.TextHint);
            end;
        end;
    end;
    

    但请求头中不包含cookie字段。以下是数据包捕获的结果。当我执行程序时。请教我如何将cookie字段添加到请求头。

    Rquest of my program

    1 回复  |  直到 9 年前
        1
  •  2
  •   Remy Lebeau    9 年前

    正如@smooty86在评论中所说,您需要包括 http:// 手动添加cookie时的URL部分。您还需要包括所请求资源的完整路径,否则cookie将仅对根用户的请求有效 / 路径

    此外,您拨打的电话 TIdURI.ParamsEncode() TIdURI.URLEncode() 因为您没有使用编码的 url 变量如果你要花时间编码一个URL,那么一定要实际使用它。

    您还泄漏了所有对象。

    改为尝试以下操作:

    procedure TForm1.Button2Click(Sender: TObject);
    var
      uri : TIdURI;
      HTTP : TIdHTTP;
      vals : TStringList;
      url : String;
      response : TStringStream;
    begin
      try
        response := TStringStream.Create('');
        try
          vals := TStringList.Create;
          try
            vals.Add('__EVENTTARGET=');
            vals.Add('__EVENTARGUMENT=');
            vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A=');
            vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C');
            vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg==');
            vals.Add('ddlLanguage=ja-JP');
            vals.Add('tbUserId=myid');
            vals.Add('tbPassword=hoge');
            vals.Add('btnLogin=login');
    
            HTTP := TIdHTTP.Create;
            try
              HTTP.HandleRedirects := True;
              HTTP.AllowCookies := True;
              HTTP.CookieManager := TIdCookieManager.Create(HTTP);
    
              uri := TIdURI.Create('http://www.hoge.com/GssNet/login,aspx');
              try
                HTTP.CookieManager.AddServerCookie('ASP.NET_SessionId=test', uri);
              finally
                uri.Free;
              end;
    
              url := TIdURI.URLEncode('http://www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx');
    
              HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
              HTTP.Post(url, vals, response);
            finally
              HTTP.Free;
            end;
          finally
            vals.Free;
          end;
    
          // use response as needed...
        finally
          response.Free;
        end;
      except
        on EIdHTTPProtocolException do
        begin
          ShowMessage(Memo1.TextHint);
        end;
      end;
    end;
    

    最后,为什么要向发送请求 login,aspx ? 正确的名称是 login.aspx 相反 登录,aspx 服务器上不存在。