【问题标题】:How to get Cookie from page created in Delphi?如何从 Delphi 创建的页面中获取 Cookie?
【发布时间】:2022-01-06 18:10:42
【问题描述】:

注意

时间:2022.01.06 12:03

过了一段时间,我向上级解释了 使用 Delphi 创建网站并不是最好的主意, 而是被说服使用 PHP。

感谢所有参与的人!

我是 Delphi 的新手,也很抱歉我的英语不好。
我正在使用 Embarcadero Rad Studio Delphi 10.3。

我需要用 delphi 创建站点,所以我创建了新项目
"Delphi\web\webserver 应用\windows\独立GUI应用\vcl应用"

在 WebModuleUnit(可视视图),窗口“结构”中,我选择了页面的分支,并在
windows“对象检查器”转到“事件”页面->我在“OnAction”字段中创建事件
然后我切换到代码视图并在“WMTestPageAction”程序中编写了这段代码

procedure TWebModule1.WMTestPageAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  var
   tstStr:tstrings;
  const 
   cookieUserName='UserNameXYZ';
begin

  Response.Content :=
    '<!DOCTYPE html>'+
    '<html>'+
    '<head>'+
      '<title>Test page</title>'+
    '</head>'+
    '<body>';


tstStr:=TStringList.Create;

//Request.Create;
Request.ExtractCookieFields(tstsTr);
Response.Content :=Response.Content+'<div>test output<br>'+
'get cookie name User = '+cookieUserName+' ; Request.Cookie  = '+Request.Cookie +'<br>'+
'get cookie name User = '+cookieUserName+' ; inttostr(Request.Cookie.Length)  = '+inttostr(Request.Cookie.Length) +'<br>'+
'get cookie name User = '+cookieUserName+' ; Request.ContentFields.Text  = '+Request.ContentFields.Text +'<br>'+
'get cookie name User = '+cookieUserName+' ; Request.ContentFields.Values[''UserNameXYZ'']  = '+Request.ContentFields.Values['UserNameXYZ'] +'<br>'+
'get cookie name Token= '+cookieUserToken+' ; Request.ContentFields.Values[cookieUserToken] = '+Request.ContentFields.Values[cookieUserToken]+'<br>'+
' Request.Content = '+ Request.Content +'<br>'+
' tstsTr.Text = '+ tstsTr.Text +'<br>'+

'<br>Response<br>'+
' Response.HTTPRequest.Cookie '+ Response.HTTPRequest.Cookie +'<br>'+
' Response.Cookies.Count = '+ IntToStr(Response.Cookies.Count) +'<br>'+
' Response.GetCustomHeader(''name2'') = '+ Response.GetCustomHeader('name2') +'<br>'+

' Response.GetCustomHeader(''name2'') = '+ '' +'<br>'+

'</div>';

Response.Content :=Response.Content+'</body></html>';
end;

在“响应”中,我可以形成我的页面,并使用它来获取测试信息,
我可以用Response.SetCookieField(scValues,scDomen,scPath,scExpiries,scSecure);设置Cookie
但我无法在加载页面上的 delphi 中获取 cookie,我尝试的所有内容都是在代码中编写的。

在浏览器控制台中使用命令 document.cookie
我收到"name2=value2; UserNameXYZ=jack; token=sd78sd78s7d8s"

我想检查每次加载我网站中所有页面时的用户会话。
代码中的响应和请求属于模块“Web.HTTPApp”。

请指教。

编辑

// 12:30 I comment line with:
Request.Create; //did'nt help
  • tstsTr 变量仅出于获取 cookie 的原因而创建,我认为我使用了错误或遗漏了某些内容。

【问题讨论】:

  • 你为什么打电话给Request.Create?那不属于,摆脱它。另外,您正在泄漏tstStr
  • Request.Create 可能只是简单地破坏了请求内容(连同其中的 cookie)。您不应该创建请求 - 它已经创建并传递给您的过程。我认为只需删除 Request.Create 行即可。

标签: delphi web cookies


【解决方案1】:

终于找到信息from embarcadero in 1999

procedure TWebModule1.WebModule1WebActionItem3Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  i: integer;
begin
  Response.Content := '';
  for i := 0 to (Request.CookieFields.Count - 1) do
  begin
    Response.Content := Response.Content + '

' +
    Request.CookieFields[i] + '
';
  end;
  Response.Content := Response.Content + '';
end;

我使用的提取物

function getCookieFieldByName(Sender:TStrings;vCookieName:string):string;
var i:Integer;
begin
  result:='';
  for i := 0 to (Sender.Count - 1) do
  begin
   if Pos( vCookieName+'=',Sender[i] ) >0 then
   begin
    result:= Sender[i];
    result:= Copy(result, Pos('=',result)+1 );
    Break;
   end;
  end;
end;

调用看起来像这样

result := getCookieFieldByName(Request.CookieFields,cookieUserName);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2011-09-13
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多