XMLHTTPREQUEST redirect behandeln

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • XMLHTTPREQUEST redirect behandeln

    Jo ich mal wieder,

    Ich habe volgendes Problem.

    Ich erstelle eine XMLHTTPREQUEST und bekomme auch einen response, allerdings mit einem redirect :(
    Problem is das die Seite dann neu geladen wird.
    Meine Frege nun ist, wie behandle ich ein redirect in meinem Contentloader.
    Ist es möglich, den redirect abzufangen oder den response erst freizugeben, wenn der redirect erfolgt ist?

    MfG Cyb081
  • hi d0nut,

    nein leider habe ich keinen Einfluss auf die zu geladene Website.
    Es ist eine Login php-Seite.
    Letztendlich schicke ich die Logindaten dorthin und bekomme einen Response.

    Wie ich jetzt mitbekommen habe befinded sich im head-Bereich des response folgendes:

    Quellcode

    1. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" dir="ltr">
    2. <head>
    3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4. <meta http-equiv="Refresh" content="10;url=http://de.wikipedia.org/wiki/Hauptseite" />
    5. ...


    deswegen wird das Browserfenster veranlasst diese Seite (http://de.wikipedia.org/wiki/Hauptseite) anzuzeigen. Was ich aber gar nicht will. Ich möchte bei dem Response einfach nur schauen, ob eine JS-Variable gesetzt wurde oder nicht. Sprich ob der Login erfolgt ist oder nicht.
    D.h. ich zeige den Response nicht mal im Browserfenster an. Trotzdem wird dieser Refresh ausgeführt.

    Was ich schon versucht habe ist, dieses Element zu löschen. Aber anscheint wird das ganze schon vom Browser interpretiert :(.


    Any ideas?

    Ist es vielleicht möglich, diese Daten zur Login.php zu schicken ohne einen Response zu bekommen? Weil dann könnte ich es einfach hinschicken und einen normalen request machen und bei dem Response dann überprüfen, ob die JS-Variable gesetzt ist.
  • na den XHR hab ich ja schon hinbekommen.
    Aber wie gesagt im Response steht das mit drin.

    Quellcode

    1. <meta http-equiv="Refresh" content="10;url=http://de.wikipedia.org/wiki/Hauptseite" />


    und obwohl ich den nirgends einfüge, führt mein Browserfenster diesen Refresh durch. ein löschen der Zeile hat auch nichts gebracht :(
  • meinst du das hier?:

    Quellcode

    1. sendLogin: function(){
    2. var ref = this;
    3. var para = Form.serialize('myForm')+'&amp;wpLoginattempt';
    4. this.loader1=new ContentLoader( 'http://'+$('selWiki').value+'/w/index.php?title=Spezial:Userlogin&action=submitlogin&type=login', function(){ref.controllLogin(this.req);}, null, 'POST', para);
    5. },
    6. controllLogin: function(){
    7. //überprüfe, ob variable gesetzt ist
    8. }
    Alles anzeigen
  • Hm, ja, wenn das die einzige Stelle ist, dann meinte ich den Ausschnitt
    Sehr merkwürdig, dass der HTML Code in diesem Snippet interpretiert wird

    Nutzt du die ContentLoader Methode aus dem "Ajax in Action" Buch?

    Kannst du die wesentliche Abschnitte deines gesamten Quelltextes mal kürzen und hier komplett (lauffähig) posten? Dann würd ich versuch ein bisschen dranrumzubasteln.
  • jup is der Contentloader.

    Quellcode

    1. var LoginController=Class.create();
    2. LoginController.prototype = {
    3. initialize: function(btnHandler){
    4. this.myBtnHandler = btnHandler;
    5. this.logged=false;
    6. },
    7. checkLogin: function(reqURL){
    8. this.reqURL = reqURL;
    9. if (reqURL){
    10. var ref = this;
    11. this.loader1=new net.ContentLoader( 'http://de.wikipedia.org/w/index.php?title=Spezial:Userlogin', function(){ref.controllLogin(this.req);});
    12. }
    13. },
    14. //Überprüft, ob die Javascriptvariable USERID im Response ist, wenn nicht lade LoginScreen, wenn gesetzt Lade Content
    15. controllLogin:function(){
    16. var dom = this.stringToDOM(this.loader1.req.responseText);
    17. alert(this.loader1.req.responseText);
    18. //filter JS-Elemente
    19. var jScripts = dom.getElementsByTagName('script');
    20. this.logged = true;
    21. //Durchläuft die JS-Elemente und überprüft JS-Variable wgUserName
    22. for(var i=0; i<jScripts.length; i++){
    23. var scriptTxt= (jScripts[i].hasChildNodes()) ? jScripts[i].firstChild.nodeValue : 'empty ';
    24. //Wenn wgUserName nicht gesetzt ist, setze logged auf false
    25. if((scriptTxt.search(/wgUserName = null/) != -1)){
    26. alert('keine UserId gesetzt');
    27. this.logged=false;
    28. }
    29. }
    30. //Wenn eingeloggt, dann lade Seite
    31. if(this.logged == true){
    32. var ref = this;
    33. this.loader2=new net.ContentLoader( this.reqURL, function(){ref.displayContent(this.req);});
    34. }
    35. //Wenn nicht eingeloggt öffne LoginDialog
    36. else{
    37. var ref= this;
    38. Dialog.confirm($('login').innerHTML, {windowParameters: {className:"alphacube", width:400}, okLabel: "login", cancelLabel: "cancel",ok:function(){ref.sendLogin(this);}});
    39. }
    40. },
    41. sendLogin: function(pwc){
    42. //alert("processing -> " + pwc.getId());
    43. Dialog.closeInfo();
    44. var ref = this;
    45. var para = Form.serialize('myForm')+'&amp;wpLoginattempt';
    46. this.loader1=new net.ContentLoader( 'http://de.wikipedia.org/w/index.php?title=Spezial:Userlogin&action=submitlogin&type=login', function(){ref.controllLogin(this.req);}, null, 'POST', para);
    47. },
    48. displayContent: function(){
    49. $('content').innerHTML=this.loader2.req.responseText;
    50. },
    51. //wandelt einen xhtml-String in ein Dom_Objekt um
    52. stringToDOM: function(reqString){
    53. if(typeof DOMParser != "undefined"){
    54. return (new DOMParser).parseFromString(reqString, "text/xml");
    55. }
    56. else if(typeof ActiveXObject != "undefined"){
    57. var parser = new ActiveXObject("Microsoft.XMLDOM");
    58. parser.async = "false";
    59. parser.loadXML(reqString);
    60. return parser;
    61. }else if (typeof XMLHttpRequest != "undefined") {
    62. var req2 = new XMLHttpRequest;
    63. req2.open("GET", "data:" + (contentType || "application/xml") +
    64. ";charset=utf-8," + encodeURIComponent(reqString), false);
    65. if (req2.overrideMimeType) {
    66. req2.overrideMimeType(contentType);
    67. }
    68. req2.send(null);
    69. return req2.responseXML;
    70. }
    71. }
    72. };
    Alles anzeigen


    das ist die Loginklasse und nen bisschen gekürzt .

    Dialog.confirm ist aus der AJAX Window Class auf Prototype basis.
    Am besten ich schick dir das mal alles per mail. dann brauchst du nicht noch irgendwas downloaden.

    bei fragen fragen
  • "Cyb081" schrieb:

    obwohl ich den nirgends einfüge, führt mein Browserfenster diesen Refresh durch. ein löschen der Zeile hat auch nichts gebracht :(


    naja, die displaycontent fügt den code schon ein.
    Aber wenn du den Code löschst ist es doppelt merkwürdig. Vielleicht wird aber auch nur eine Cache Version geladen.

    Als Lösung verhinderst du einfach den Aufruf der displayContent()
  • dann wird nichts anderes übrig bleiben, als die weiterleitung rauszuschneiden

    http://de.selfhtml.org/javascript/objekte/string.htm#replace

    Quellcode

    1. <html><head><title>Test</title></head><body>
    2. <script type="text/javascript">
    3. var vormals = "vorher <meta http-equiv=\"Refresh\" content=\"10;url=http://de.wikipedia.org/wiki/Hauptseite\" /> nachher";
    4. var jetzt = vormals.replace(/(<meta.*>)/, "REPLACE");
    5. document.write(jetzt);
    6. </script></body></html>