quarta-feira, 25 de julho de 2007

Como realizar requisições AJAX fora do domínio

O Firefox tem um dispositivo de segurança que impede que requisições AJAX sejam realizadas entre domínios. Mas muitas vezes precisamos deste tipo de requisição. Existem métodos para burlar essa segurança, mas vou mostar o método mais simples aqui.

Você deve criar uma página server-side (JSP, ASP ou PHP) que busque a URL para você e então você pode fazer a requisição AJAX para uma página em seu domínio. Um exeplo usando JSP e JSTL (tag library) seria assim:


<%@page contentType="text/xml"
%><%@page pageEncoding="UTF-8"
%><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"
%><c:import url="${param.url}"></c:import>



É isso mesmo. apenas 4 linhas de código, que facilmente poderiam virar 3. Quem conhce JSP sabe do que eu estou falando.

Para o JSTL funcionar, você precisa ter a biblioteca JSTL no diretorio lib de sua aplicação ou no diretório common/lib do Tomcat (não saberia dizer ao certo o diretório correto para outros containers).

Agora, você deve repara que estou fechando (%>) cada TAG na linha posterior. Isso foi uma dica que aprendi para tirar as linhas em branco que o Tomcat coloca nas páginas quando você insere uma TAG JSP. Isso é muito útil para quando você vai fazer um request de um documento XML. O Firefox só aceita documentos XML que começam na primeira linha do documento.

Como usar?

Supondo que você salvou a sua página JSP como ajax.jsp, no método que faz a requisição você vai usar o URL:


ajax.jsp?url=URL_REAL_QUE_VOCÊ_DESEJA


por exemplo:


ajax.jsp?url=http://www.google.com


Espero que esta postagem seja útil para vocês.

3 comentários:

pedro disse...

mt obrigado! solução simples e eficaz

Rômulo disse...

Não consegui...Qndo tentei chamar http://www.google.com.br deu o seguinte erro:
Erro no processamento de XML: not well-formed
Posição: http://localhost:8080/Ged/pages/ajax.jsp
Número da linha 3, Coluna 99:window.gbar={};(function(){var b=window.gbar,f,h;b.qs=function(a){var c=window.encodeURIComponent&&(document.forms[0].q||"").value;if(c)a.href=a.href.replace(/([?&])q=[^&]*|$/,function(i,g){return(g||"&")+"q="+encodeURIComponent(c)})};function j(a,c){a.visibility=h?"hidden":"visible";a.left=c+"px"}b.tg=function(a){a=a||window.event;var c=0,i,g=window.navExtra,d=document.getElementById("gbi"),e=a.target||a.srcElement;a.cancelBubble=true;if(!f){f=document.createElement(Array.every||window.createPopup?"iframe":"div");f.frameBorder="0";f.src="#";d.parentNode.appendChild(f).id="gbs";if(g)for(i in g)d.insertBefore(g[i],d.firstChild).className="gb2";document.onclick=b.close}if(e.className!="gb3")e=e.parentNode;do c+=e.offsetLeft;while(e=e.offsetParent);j(d.style,c);f.style.width=d.offsetWidth+"px";f.style.height=d.offsetHeight+"px";j(f.style,c);h=!h};b.close=function(a){h&&b.tg(a)}})();
(...tem mais coisas)

Gui Hermeto disse...

Rômulo,

desculpe a imensa demora. O exemplo citado está servindo um XML e não uma página HTML. Para você servir uma página HTML, mude seu contentType.
O firefox é exigente com o formato do XML que ele exibe.