Delphi - d'Indy (IDHTTP) Garder la Session
Ok, j'ai Idhttp créé dynamiquement comme suit
procedure TForm1.Button1Click(Sender: TObject);
Var
Resp : String;
begin
Resp := webSession('https://www.website.com'); // HTTPS site requires session to keep alive
if Length(Resp)>0 then
MessageDlg('Got the body ok',mtInformation,[mbOk],0);
end;
function TForm1.webSession(sURL : ansistring) : ansistring;
var
SStream : Tstringstream;
HTTPCon : TIdHTTP;
AntiFreeze : TIdAntiFreeze;
CompressorZLib: TIdCompressorZLib;
ConnectionIntercept: TIdConnectionIntercept;
SSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
CookieManager: TIdCookieManager;
begin
CompressorZLib := TIdCompressorZLib.Create;
ConnectionIntercept :=TIdConnectionIntercept.Create;
SSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
Result := '';
if Length(SettingsForm.edtProxyServer.text) >= 7 then // 0.0.0.0
Try
SStream := NIL;
AntiFreeze := NIL;
HTTPCon := NIL;
Try
SStream := tstringstream.Create('');
{ Create & Set IdHTTP properties }
HTTPCon := TIdHTTP.create;
HTTPCon.AllowCookies:=true;
HTTPCon.CookieManager :=CookieManager;
HTTPCon.Compressor := CompressorZLib;
HTTPCon.Intercept := ConnectionIntercept;
HTTPCon.IOHandler := SSLIOHandlerSocketOpenSSL;
HTTPCon.HandleRedirects := true;
{ Check Proxy }
if checkproxy('http://www.google.com') then
Begin
HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
HTTPCon.ProxyParams.BasicAuthentication := True;
HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
End;
{ Create another AntiFreeze - only 1/app }
AntiFreeze := TIdAntiFreeze.Create(nil);
AntiFreeze.Active := true;
HTTPCon.Get(sURL,SStream);
Result := UTF8ToWideString(SStream.DataString);
Finally
If Assigned(HTTPCon) then FreeAndNil(HTTPCon);
If Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
If Assigned(SStream) then FreeAndNil(SStream);
If Assigned(CookieManager) then FreeAndNil (CookieManager );
If Assigned(CompressorZLib) then FreeAndNil (CompressorZLib );
If Assigned(ConnectionIntercept) then FreeAndNil (ConnectionIntercept );
If Assigned(SSLIOHandlerSocketOpenSSL) then FreeAndNil (SSLIOHandlerSocketOpenSSL);
End;
Except
{ Handle exceptions }
On E:Exception do
MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
End;
end;
function TForm1.checkproxy(sURL : ansistring) : boolean;
var
HTTPCon : TIdHTTP;
AntiFreeze : TIdAntiFreeze;
begin
Result := False;
Try
{ Inti vars }
AntiFreeze := NIL;
HTTPCon := NIL;
Try
{ AntiFreeze }
AntiFreeze := TIdAntiFreeze.Create(NIL);
AntiFreeze.Active := true;
{ Create & Set IdHTTP properties }
HTTPCon := TIdHTTP.Create(NIL);
HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
HTTPCon.ProxyParams.BasicAuthentication := True;
HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
HTTPCon.HandleRedirects := true;
HTTPCon.ConnectTimeout := 1000;
HTTPCon.Request.Connection := 'close';
HTTPCon.Head(sURL);
Finally
{ Cleanup }
if Assigned(HTTPCon) then
Begin
{ Return Success/Failure }
Result := HTTPCon.ResponseCode = 200;
If HTTPCon.Connected then HTTPCon.Disconnect;
FreeAndNil(HTTPCon);
End;
if Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
End;
Except
On E:EIdException do ;
{ Handle exceptions }
On E:Exception do
MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
End;
end;
J'ai un site web qui m'oblige à garder une session en vie. Comment puis-je faire? Avec un code similaire à ci-dessus.
Si je créer un composant visuel pour tout, et à l'utiliser tout ce qui est grand, mais quand je créer dynamiquement le composant (dont j'ai VRAIMENT envie de laisser cette manière), il ne parvient pas à garder la session en vie.
Toute aide est appréciée.
OriginalL'auteur Brad | 2010-02-14
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas où vous instanciez
CookieManager
, mais c'est là que vous devez garder une trace de la session. Le serveur va envoyer du cookie qui représente la session en cours, et toutes les autres demandes que vous envoyez au serveur doit inclure le cookie de sorte que le serveur ne sait quelle session d'utilisation.Vous aurez à conserver le cookie manager de l'objet autour de la durée de la session, ou vous aurez à enregistrer ses données ailleurs et ensuite chargez-la à chaque fois que vous créez un nouveau cookie-gestionnaire d'objet. Je préfère l'ancien. En fait, vous pourriez envisager de garder l'ensemble du HTTP objet autour de la.
OriginalL'auteur Rob Kennedy
Comme vous l'avez mentionné dans vos commentaires, vous êtes la création d'CookieManager dans l'événement OnCreate de gestionnaire, de sorte que lorsque TForm1.webSession est appelé, CookieManager est disponible, mais dans le bloc finally de TForm1.webSession vous libérer CookieManager, donc une fois que vous quittez TForm1.webSession méthode, CookieManager est à court de mémoire. Alors, la prochaine fois TForm1.webSession est appelé, CookieManager est Nul, et aucun cookie est enregistré pour vous.
Il y a deux autres notes, qui ne sont pas liés à votre question, mais sont liés à votre code source:
1 - Votre méthode est de retour AnsiString, mais vous utilisez Utf8ToWideString pour attribuer une valeur à la variable Résultat. Utf8ToWideString retourne WideString, de sorte que le compilateur a convertir WideString à AnsiString, et non seulement cela réduit les performances, mais aussi il perd les caractères unicode dans le retour de la chaîne. Vous devriez changer votre signature de la méthode pour renvoyer la Chaîne (D2009 & D2010) ou WideString (les Anciennes versions de Delphi).
2 - Vous n'avez pas besoin de vérifier si la Succession, de l'Antigel ou HTTPCon sont affectés dans le bloc finally. Vous pouvez simplement appeler la méthode Libre, ou de l'utilisation FreeAndNil procédure.
Ce qui concerne
OriginalL'auteur vcldeveloper
Que Rob a dit votre TIdCookieManager est la clé pour le maintien d'un Cookie de session. Le TIdCookieManager pourrait être créé dans un datamodule de créer l'événement ou le mainforms OnCreate() de l'événement et ensuite définir à chaque fois que vous créez un IdHTTP composant.
Pas de problème, heureux d'être de l'aide! - Avez-vous regardé dans l'aide de fils pour la communication des pièces? Pourrait faire pour un roulement plus doux si elle peut être mise en œuvre dans votre code?
Ouais, j'ai été à la recherche à une tige de démo, mais le filetage est un peu plus de mon niveau de connaissance en Delphi. Et beaucoup de ce que ce projet n'est en contact avec le même site web, encore et encore, je n'ai pas besoin/envie d'une demande multiple pour celui-ci. Mais j'utilise le même code de base dans un couple d'autres projets, et il serait bon de les enfiler. Avez-vous des suggestions sur une bonne démo fil?
C'est un grand sujet, donc une nouvelle question qui est peut-être la meilleure façon d'aller. Je peux certainement vous aider à cela, mais la mise en œuvre peut être différent selon l'utilisation et les besoins...
OriginalL'auteur K.Sandell