PDA

View Full Version : جلوگیری از Refresh صفحه بعد از Login در دلفی



dark-man
پنج شنبه 27 فروردین 1388, 21:16 عصر
با سلام و خسته نباشید خدمت همه اساتید . در مورد عنوان فوق مشکلی دارم که ممنون میشم بنده رو راهنمائی کنید .

بنده نرم افزاری رو طراحی کردم که از طریق اون میشه به یه سایت login کرد و به صفحه member یا profile رفت . وقتی نرم افزار رو اجرا می کنم و سایت رو فراخوانی می کنم . سایت به راحتی و صحیح فراخوانی میشه اطلاعات ورود به سیستم در فیلدها قرار می گیره و عمل submit هم اجرا میشه . اما بعد از اجرای submit نرم افزار دوباره به همون صفحه login بر میگرده و دوباره عمل login انجام میشه این کار بارها و بارها اجرا میشه و وارد سایت نمیشه در قسمت debug دلفی هم مکررا" Thread startو Thread Exit نوشته میشه .

ممنون میشم در این زمینه راهنمائیم کنید . در نرم افزار از TWebBrowser استفاده کردم . صفحات Login هم aspx هستند .

ghabil
یک شنبه 30 فروردین 1388, 01:06 صبح
بهتر بود اینو تو قسمت وب میزاشتی:
مشکلت بنظر میاد این باشه که تو مقدار سشن آیدی رو بعد از لاگین کردن نمیگیری:
بعد از اینکه توی یک سایت لاگین میکنی سایت بهت یک سشن آیدی میده تا توی ریکوستهای بعدی از روی اون آیدی بشناستت و بدونه که تو قبلا لاگین کردی و تو هم باید هربار که با سایت مراجعه میکنی این آیدی رو برگردونی ، در غیر اینصورت دوباره میبرتت به صفحه لاگین، معمولا این سشن آیدی داخل یک کوکی در پاسخ لاگین فرستاده میشه ولی در حالتهای دیگه میتونه داخل یک Hidden Field داخل HTML یا بصورت یک پارامتر توی URL فرستاده بشه ... به هر حال تو باید جوابی که بعد از لاگین برات فرستاده میشه رو بررسی کنی و سشن آیدی رو بدست بیاری و توی ریکوئستهای بعدی بفرستی ، البته اگر سشن آیدی بصورت کوکی باشه معمولا این کار بصورت اتوماتیک انجام میشه ...

امیدوارم توضیحاتم مفهوم بوده باشه ، بازم جایی گیر کردی بگو

dark-man
یک شنبه 30 فروردین 1388, 10:30 صبح
بهتر بود اینو تو قسمت وب میزاشتی:
مشکلت بنظر میاد این باشه که تو مقدار سشن آیدی رو بعد از لاگین کردن نمیگیری:
بعد از اینکه توی یک سایت لاگین میکنی سایت بهت یک سشن آیدی میده تا توی ریکوستهای بعدی از روی اون آیدی بشناستت و بدونه که تو قبلا لاگین کردی و تو هم باید هربار که با سایت مراجعه میکنی این آیدی رو برگردونی ، در غیر اینصورت دوباره میبرتت به صفحه لاگین، معمولا این سشن آیدی داخل یک کوکی در پاسخ لاگین فرستاده میشه ولی در حالتهای دیگه میتونه داخل یک Hidden Field داخل HTML یا بصورت یک پارامتر توی URL فرستاده بشه ... به هر حال تو باید جوابی که بعد از لاگین برات فرستاده میشه رو بررسی کنی و سشن آیدی رو بدست بیاری و توی ریکوئستهای بعدی بفرستی ، البته اگر سشن آیدی بصورت کوکی باشه معمولا این کار بصورت اتوماتیک انجام میشه ...

امیدوارم توضیحاتم مفهوم بوده باشه ، بازم جایی گیر کردی بگو


ممنون برا كمكت . مشكل من در اصل از اونجا شروع شد كه من تونستم مقدار فيلدهاي روي فرم وب سايت رو پر كنم اما نتونستم فرم رو submit كنم چند تا كد رو هم تست كردم اما نتونستم فرم رو submit كنم . در اين زمينه ميشه كمكم كني ؟

ghabil
دوشنبه 31 فروردین 1388, 01:01 صبح
متوجه نمیشم :
یک StringList میسازی نام فیلدها و مقادیر رو توشون میزنی بعد هم Post میکنی به آدرسی که میخوای Submit بشه .(مثلا با یک TIDHttp) ، آدرس Submit رو هم از Action فرم میاری ... بجز این مشکلی داری؟

dark-man
دوشنبه 31 فروردین 1388, 19:39 عصر
متوجه نمیشم :
یک StringList میسازی نام فیلدها و مقادیر رو توشون میزنی بعد هم Post میکنی به آدرسی که میخوای Submit بشه .(مثلا با یک TIDHttp) ، آدرس Submit رو هم از Action فرم میاری ... بجز این مشکلی داری؟


سلام . من نمونه کدی که باهاش کار کردم و به جواب نرسیدم رو برات اینجا میذارم . ممنون میشم اگه نمونه من رو بررسی کنی و یک نمونه از روشی که خودت گفتی رو در اختیارم بذاری . اگه لطف کنی و اشکالات نمونه خودم رو هم بگی ممنون میشم .



unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OleCtrls, SHDocVw, StdCtrls, mshtml, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Panel1: TPanel;
BitBtn1: TBitBtn;
Label1: TLabel;
Button1: TButton;
procedure WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);

private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var iDoc: IHtmlDocument2;
i: integer;
ov: OleVariant;
iDisp: IDispatch;
iColl: IHTMLElementCollection;
iInputElement: IHTMLInputElement;
begin
WebBrowser1.ControlInterface.Document.QueryInterfa ce(IHtmlDocument2, iDoc);
if not assigned(iDoc) then begin
ShowMessage(' !!!??? Nothing dowloaded ... ');
Exit;
end;
ov := 'INPUT';
IDisp := iDoc.all.tags(ov);
if assigned(IDisp) then begin
IDisp.QueryInterface(IHTMLElementCollection, iColl);
if assigned(iColl) then begin
for i := 1 to iColl.Get_length do begin
iDisp := iColl.item(pred(i), 0);
iDisp.QueryInterface(IHTMLInputElement, iInputElement);
if assigned(iInputElement) then begin
if iInputElement.Get_name = '__ViewStateGuid'
then iInputElement.Set_value('e34ab1f3-7047-48dd-8b81-c3b4830f2905');
// if iInputElement.Get_name = '__VIEWSTATE'
// then iInputElement.Set_value('');
// if iInputElement.Get_name = '__VIEWSTATE'
// then iInputElement.Set_value('e34ab1f3-7047-48dd-8b81-c3b4830f2905');
if iInputElement.Get_name = 'UsrNam'
then iInputElement.Set_value('****');
if iInputElement.Get_name = 'UsrPwd'
// password
then iInputElement.Set_value('*****');
//Button.click
if iInputElement.Get_name = 'CheckIt'
then iInputElement.Get_form.submit;
// Show the Titel of the currently active Webpage in the titlebar
// Den Titel der aktuellen Webseite in der Titeleiste anzeigen
Caption := Webbrowser1.OleObject.Document.Title
end;
end;
end;
end;
end;

//When the document is Complete the form where you can put your homepage
//address is filled out
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
// webbrowser1.Navigate('http://utilco.tejaratbank.ir/UserLogin.aspx?ShowTejaratFile.aspx%3fParTree=1111 ');
// WebBrowser1.Navigate('http://utilco.tejaratbank.ir/UserLogin.aspx');
end;

//Logout
procedure TForm1.Button1Click(Sender: TObject);
begin
// webbrowser1.navigate('http://de.f205.mail.yahoo.com/ym/Logout?YY=14717&.first=1?YY=14717');
end;

// Status Page loaded
procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
begin
if ProgressMax = 0 then
begin
label1.Caption := '';
Exit;
end;
try
if (Progress <> -1) and (Progress <= ProgressMax) then
label1.Caption := IntToStr((Progress * 100) div ProgressMax) + '% loaded ...'
else
label1.Caption := '';
except
on EDivByZero do Exit;
end;
end;
end.



ممنون میشم اگه در این مورد کمکم کنید .

ghabil
دوشنبه 31 فروردین 1388, 22:11 عصر
همونطوری که بهت گفتم بجای این روش که الان استفاده میکنی از این روش استفاده کن (http://barnamenevis.org/forum/showthread.php?t=84638). روش فعلی بدرد کاری که میخوای بکنی نمیخوره.

ghabil
سه شنبه 01 اردیبهشت 1388, 17:54 عصر
در جواب سوالاتی که آفلاین گذاشته بودی به این پست نکته مهم رو اضافه کردم (http://barnamenevis.org/forum/showthread.php?p=420638#post420638)

لطفا سوالات را اینجا بپرس که بعدا برای سایرین هم قابل دسترس باشه.

dark-man
چهارشنبه 02 اردیبهشت 1388, 10:22 صبح
در جواب سوالاتی که آفلاین گذاشته بودی به این پست نکته مهم رو اضافه کردم (http://barnamenevis.org/forum/showthread.php?p=420638#post420638)

لطفا سوالات را اینجا بپرس که بعدا برای سایرین هم قابل دسترس باشه.


سلام . جناب قابیل من نمونه کد رو با آخرین تغییری که فرمودید تست کردم اما بازهم جوابی نگرفتم . آیا غیر از این راه دیگه ای هست ؟

ghabil
پنج شنبه 03 اردیبهشت 1388, 09:00 صبح
ببین مشکل از راه نیست! برای کاری که میخواهی بکنی راه درست و بهینه همینیه که گفنم ، این راه رو هم من و هم خـــــیلیهای دیگه بارها و بارها استفاده کردیم و جواب میده، پس اجتمالا مشکل از نحوه پیاده سازیت هست، برای حل اون مشکل هم پارامترهایی که میسازی رو + آدرس صفحه ای که پارامترها رو میفرستی به من بده من صفحه HTML رو با پارامترهات مقایسه کنم همینوطر ببینم سشن رو چطوری هندل مبکنه شاید بتونم بهتر بهت کمک کنم...

dark-man
پنج شنبه 03 اردیبهشت 1388, 19:38 عصر
ببین مشکل از راه نیست! برای کاری که میخواهی بکنی راه درست و بهینه همینیه که گفنم ، این راه رو هم من و هم خـــــیلیهای دیگه بارها و بارها استفاده کردیم و جواب میده، پس اجتمالا مشکل از نحوه پیاده سازیت هست، برای حل اون مشکل هم پارامترهایی که میسازی رو + آدرس صفحه ای که پارامترها رو میفرستی به من بده من صفحه HTML رو با پارامترهات مقایسه کنم همینوطر ببینم سشن رو چطوری هندل مبکنه شاید بتونم بهتر بهت کمک کنم...

سلام . من مشكل رو با سور كدي كه خودم نوشتم + يه كد جاوا اسكريپت حل كردم . مشكل كد من اين بود كه من به جاي اين كه رويداد كليلك دكمه submit رو فراخواني كنم submit فرم رو فراخواني مي كردم براي همين صفحه refresh مي شد . از طرفي چون چند تا submit تعريف شده بود فرم درست ارسال نمي شد . در اسرع وقت نمونه كد رو اينجا ميذارم تا همه دوستان ببينن .

جناب قابيل صميمانه از تمام لطف و كمكي كه بهم كرديد سپاسگذارم .

dark-man
شنبه 05 اردیبهشت 1388, 12:26 عصر
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OleCtrls, SHDocVw, StdCtrls, mshtml, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Panel1: TPanel;
Button1: TButton;
Label1: TLabel;
BitBtn1: TBitBtn;
Memo1: TMemo;
Button2: TButton;
procedure WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);

private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var iDoc: IHtmlDocument2;
i: integer;
ov: OleVariant;
iDisp: IDispatch;
iWindow: IHTMLWindow2;
iColl: IHTMLElementCollection;
iInputElement: IHTMLInputElement;
begin
Memo1.Clear;
WebBrowser1.ControlInterface.Document.QueryInterfa ce(IHtmlDocument2, iDoc);
if not assigned(iDoc) then begin
ShowMessage(' !!!??? Nothing dowloaded ... ');
Exit;
end;
ov := 'INPUT';
IDisp := iDoc.all.tags(ov);
if assigned(IDisp) then begin
IDisp.QueryInterface(IHTMLElementCollection, iColl);
if assigned(iColl) then begin
for i := 1 to iColl.Get_length do begin
iDisp := iColl.item(pred(i), 0);
iDisp.QueryInterface(IHTMLInputElement, iInputElement);
Memo1.Lines.Add(iInputElement.Get_name);
if assigned(iInputElement) then begin
if iInputElement.Get_name = '__ViewStateGuid'
then iInputElement.Set_value('e34ab1f3-7047-48dd-8b81-c3b4830f2905');
if iInputElement.Get_name = '*****' نام فيلدي كه نام كاربري ميگيره اينجا قرار ميگيره
then iInputElement.Set_value('*****'); مقدار فيلد نام كاربري هم اينجا set ميشه
if iInputElement.Get_name = '*****' نام فيلدي كه پسورد ميگيره اينجا قرار ميگيره
then iInputElement.Set_value('****'); مقدار فيلد پسورد هم اينجا set ميشه
if iInputElement.Get_name = 'CheckIt' then
begin
iWindow := iDoc.parentWindow;
iWindow.execScript('javascript:document.getElement ById('+QuotedStr('CheckIt')+').click();', 'JavaScript');
end;
Caption := Webbrowser1.OleObject.Document.Title
end;
end;
end;
end;
end;

//When the document is Complete the form where you can put your homepage
//address is filled out
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
// webbrowser1.Navigate('http://www.gmail.com');
- Hide quoted text -
WebBrowser1.Navigate('****'); فراخواني صفحه اي فرم لاگين در آن وجود دارد
end;

//Logout
procedure TForm1.Button1Click(Sender: TObject);
begin
// webbrowser1.navigate('*******'); از اين دكمه براي logout ميشه استفاده كرد .
end;

// Status Page loaded
procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
begin
if ProgressMax = 0 then
begin
label1.Caption := '';
Exit;
end;
try
if (Progress <> -1) and (Progress <= ProgressMax) then
label1.Caption := IntToStr((Progress * 100) div ProgressMax) + '% loaded ...'
else
label1.Caption := '';
except
on EDivByZero do Exit;
end;
end;
end.



اين هم كدي كه من تونستم توسط اون به صفحات aspx لاگين كنم . فقط بايد ايونت click دكمه رو فراخواني مي كردم . تقديم به دوستاني كه در اين زمينه مشكلي دارند . شايد مشكلشون با اين حل بشه . اطلاعات رو مي تونيد از سورس صفحه به دست بياريد .