mercoledì 24 gennaio 2007

XMLHTTPRequest Same Origin Policy

AJAX{
Asynchronous Javascript And XML


C'ho un post-it su Netvibes da parecchio tempo, ma non ho mai avuto tempo di applicarmici.
Negli ultimi mesi ho passato in rassegna parecchie cosette interessanti, collezionando e catalogando script e link interessanti

oggi ho avuto modo di realizzare la mia prima applicazione sfruttando ajax: niente di ché, una paginetta che richiama il contenuto di un'altra.

Prima applicazione, prima difficoltà: neanche il tempo di iniziare e già ho incontrato il primo problema :D

Per questioni di sicurezza (?) l'oggetto XmlHttpRequest non può andare a richiamare una pagina esterna (su un server remoto) al dominio (o sito...boh) :
in pratica non si può richiamare pagine su altri siti esterni al proprio

è un problema!

Niente paura a tutto c'è soluzione ;)

Vediamo di partire da zero: voglio che la mia paginetta test_ajax.htm carichi il contenuto della home page di google.it (come una qualsiasi altra pagina)

utilizzeremo per far questo una pagina intermedia: getHttp.asp
in questa pagina non faccio altro che utilizzare il componente MSXML2.XMLHTTP per fare quello che avrei voluto fare con javascript (e che mi è stato impedito): gli passo l'url di una *qualsiasi* pagina sul web, lui se la legge e me la ritorna paro-paro (certo i css e le immagini con url relativi vanno a farsi friggere, ma si può rimediare volendo ;) )

il codice semplicissimo della pagina getHttp.asp:

<%
'### si prende l'url da un parametro
strURL = request("url")

Set objXMLHTTP = Server.CreateObject("MSXML2.XMLHTTP")

objXMLHTTP.Open "GET", StrURL, false
objXMLHTTP.Send

'### carico il contenuto (sotto forma di testo) della pagina
'### che ho scaricato nella variabile risultato Risultato
Risultato = objXMLHTTP.responseText

'### importante: lo stampo, così l'oggetto XmlHttpRequest della pagina
'### test_ajax.htm lo vedrà come il risultato della sua chiamata
response.write Risultato
%>


e ora il codice della pagina test_ajax.htm:

<html>


<body>


<script type="text/javascript">

function ajaxFunction(url)

{

var xmlHttp;

try

{

// Firefox, Opera 8.0+, Safari

xmlHttp=new XMLHttpRequest();

}

catch (e)

{

// Internet Explorer

try

{

xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");

}

catch (e)

{

try

{

xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");

}

catch (e)

{

alert("Your browser does not support AJAX!");

return false;

}

}

}

xmlHttp.onreadystatechange=function()

{

if(xmlHttp.readyState==4)

{

document.getElementById("risultato").innerHTML=xmlHttp.responseText ;

}

}

xmlHttp.open("GET","getHttp.asp?url="+url ,true);



xmlHttp.send(null);

}

</script>


Name: <input type="text" id="url" /> <input type="button"

onclick="ajaxFunction(document.getElementById('url').value);" value="Get">


<div id="risultato" style="border: 1px dashed orange"></div>


</body>

</html>


Ci sarebbe da fare una piccola precisazione: l'url passato come parametro andrebbe per sicurezza encodato, per evitare che caratteri speciali come "?" "&" eccetera possano interferire.

ma il mio è solo un concetto, gli aggiustamenti li potete fare da soli :P


Concl
Mi chiedo: a che serve inibire la possibilità di richiamare una pagina remota, se poi la cosa è facilmente aggirabile? Ignoro

}

2 commenti:

Michele ha detto...

Ho incontrato il tuo stesso problema con AJAX e mi sarebbe utile il codice ASP che hai utilizzato.
Nel post manca, puoi ripostarlo o inviarmelo a michele@netcomsas.com.
Grazie

Congetturando² ™ ha detto...

ciao, scusa ho notato il tuo commento in ritardo :D

cmq nel post c'è il codice relativo alla paginetta ASP che fa da "intermediario"

bye