AJAX: GET, POST, IE, Firefox; terugkrijgen data lukt niet

Pagina: 1
Acties:
  • 106 views sinds 30-01-2008
  • Reageer

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Topicstarter
We hebben volgende in een form staan:

HTML:
1
2
<a href="javascript:void(0);" onclick="GenereerPass();">Genereer paswoord: </a>
<input type="text" name="pass" id="pass">


Door het klikken op die link wordt een random paswoord aangemaakt. Dat doe ik met een stukje ajax:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var url = 'pass.php';

function handleHttpResponse() 
{ 
    if (http.readyState == 4) 
    {
        if (http.status == 200)
        {
            document.getElementById('pass').value = http.responseText;
        }
    } 
}   

function GenereerPass() 
{
    http.open('GET', url, true); 
    http.onreadystatechange = handleHttpResponse; 
    http.send(null);
}


In pass.php het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$pass = '';

for ($i = 0; $i < 4; $i++)
{
    $pass .= chr(mt_rand(97, 122)) . chr(mt_rand(65, 90));
}

echo $pass;
?>


Wat blijkt nu, in Firefox werkt het perfect maar in IE krijg ik altijd hetzelfde paswoord terug. Hoeveel ik ook klik op die link, hetzelfde paswoord blijft dus terug komen. Als ik pass.php echter zo even aanroep dan krijg ik wel telkens een ander paswoord. Ik heb nog nooit met POST gewerkt, wou ik dus even proberen: http.open('POST', url, true); Wat blijkt nu: hiermee werkt het perfect in IE, ik krijg telkens een ander paswoord terug. Maar in firefox werkt het dan niet meer 8)7 Ik krijg totaal niks meer te zien en in de javascript console krijg ik telkens een exception, welke zegt: data: no.

March of the Eagles


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
offtopic:
ik hoop dat je toch iets schokkenders gaat doen dan passwords generen met js/httpreq., want dit kan natuurlijk ook gewoon in JS zelf


die exception zal waarschijnlijk wel meer info geven als alleen dat.. te beginnen bij een regelnummer ;)
verder denk ik dat het best een headertje zou kunnen zijn zo van no-cache oid

This message was sent on 100% recyclable electrons.


  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Topicstarter
Die exception treedt op op regel 7, dus met http.status == 200. 200 betekent dat ie compleet is, maar blijkbaar is ie dat dan niet. Alleen werkt het wel zo in IE, maar niet in Firefox. Dit alleen via POST dus, met GET werkt het in beide alleen dat ik in IE altijd hetzelfde paswoord terug krijg.
verder denk ik dat het best een headertje zou kunnen zijn zo van no-cache oid
Kan ik proberen, alleen werkt het wel wanneer ik de pagina zelf even aanroep. En ik wou graag ook even weten waarom de POST methode niet in Firefox werkt.

[ Voor 58% gewijzigd door XWB op 11-03-2006 00:46 ]

March of the Eagles


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:18

orf

Ik laat javascript meestal een random iets mee sturen als get request; dan zal de browser altijd nieuwe content ophalen:

code:
1
http.open('GET', url + '?r=' + Math.random(), true);

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 23:58
Dat het niet werkt in IE is een cachingprobleem. Jouw IE heeft pass.php in zijn cache staan en zal de waarde daar vandaan halen en dus geen nieuwe aanroep doen naar pass.php. Mogelijke oplossingen liggen in het gebruik van de juiste cachingheaders in pass.php. Of zoals hierboven gesuggereerd, een random waarde meesturen in het request.

Het gebruik van de POST methode lost dit caching probleem op omdat de specificatie voorschrijft dat je de reponse op een POST niet moet cachen. Logisch, want de inhoud kan afhankelijk zijn van de geposte data :).
Die firefox 'data: no' foutmelding zal wel slaan op het feit dat je een url aanroept volgens de post methode, zonder daadwerkelijk data te posten. Zou je hem zo gebruiken krijg je wss wel output
JavaScript:
1
2
3
4
5
6
function GenereerPass() 
{
    http.open('POST', url, true); 
    http.onreadystatechange = handleHttpResponse; 
    http.send('I need password');
}

Ondanks het feit dat het werkt is het echter niet zo'n nette methode. Je misbruikt de POST methode om zijn caching eigenschappen. Beter is om die eigenschappen af te dwingen met de juiste headers.

[ Voor 6% gewijzigd door T-MOB op 11-03-2006 02:03 ]

Regeren is vooruitschuiven


  • TangLeFuzZ
  • Registratie: Juni 2001
  • Laatst online: 15-10-2025
De grootste blunder die mensen tegenwoordig maken wat betreft Ajax, is het implementeren ervan op manieren die totaal overbodig zijn... zoals dit.

Als je Ajax gebruikt, doe het dan alleen als je iets alleen met Ajax kunt oplossen, ga het niet gebruiken voor onnodige dingen als het genereren van passwords.

No flame intended hoor, maar ik zie de bui alweer hangen... :)

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Topicstarter
Dat het niet werkt in IE is een cachingprobleem. Jouw IE heeft pass.php in zijn cache staan en zal de waarde daar vandaan halen en dus geen nieuwe aanroep doen naar pass.php. Mogelijke oplossingen liggen in het gebruik van de juiste cachingheaders in pass.php. Of zoals hierboven gesuggereerd, een random waarde meesturen in het request.
Waarom krijgt ik dan wel telkens een andere waarde als ik pass.php zelf via de browser aanroep? Of ik de file zelf aanroep, of dat gebeurt via AJAX, wat is het verschil?
Het gebruik van de POST methode lost dit caching probleem op omdat de specificatie voorschrijft dat je de reponse op een POST niet moet cachen. Logisch, want de inhoud kan afhankelijk zijn van de geposte data
Duidelijk, thx.
Die firefox 'data: no' foutmelding zal wel slaan op het feit dat je een url aanroept volgens de post methode, zonder daadwerkelijk data te posten. Zou je hem zo gebruiken krijg je wss wel output
Dat is inderdaad niet zo netjes, die oplossing laat ik maar achterwege :)
De grootste blunder die mensen tegenwoordig maken wat betreft Ajax, is het implementeren ervan op manieren die totaal overbodig zijn... zoals dit.
Weet ik, random paswoorden genereren kan ook met enkele regels JS. Echter, ik was gewoon wat aan het uitproberen waarbij ik deze problemen ondervond en daar gaag een antwoord op had. Dit had ik dus evengoed in een "juiste" (om het nu zo te noemen) toepassing kunnen ondervinden :)

[ Voor 4% gewijzigd door XWB op 12-03-2006 20:45 ]

March of the Eagles

Pagina: 1