entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Cross Domain en Google Chrome y dispositovos moviles

Buenos días caballeros vengo solicitando su ayuda anexare mi código fuente para que se de una idea de lo que estoy tratando de hacer, el problema es que pude solucionar el problema del Cross Domain de Firefox; pero en los demás navegadores me sigue causando problemas espero puedan notar algún detalle que se me este pasando a mi.

data.php

<?php if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); } if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");

if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
    header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");} include_once('libros.php');                                                                     $libros = new libros();                                                                         $varios = $libros->getJSONDatos();                                                              $varios2= (string)$varios;                                                                      die($varios2);  ?>

service.prueba.html

<html><head>
<title></title>
<link href="css/bootstrap.min.css" rel="stylesheet">
 <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script></head>                      <body>  
 <table width="100%" border="0">
    <tr>
        <td align="center" width="100%">
            <label class="label label-primary">Realizacion de encuestas</label>
        </td>
    </tr>
</table> 
<script type="text/javascript">
var cadena;
  $.ajax({
    method: "GET",
    url : "http://192.168.0.5:8081/JSON/data.php",
    success : function(h)
    {
      cadena = JSON.parse(h);
      alert(cadena.status);
    }
          });
  var msj = "Cargando";
   alert(msj);
  alert(cadena);

    for( var i = 0; i < cadena.registro.length; i++ ) {
     document.write("<div class=\"panel panel-default\"><div class=\"panel-heading\">"+
        cadena.registro[i].Pregunta + "</div> <div class=\"panel-body\">");
            for( var j = 0; j < cadena.registro[i].Respuestas.length; j++ )
      {
    document.write(" <div class=\"radio\">&nbsp;&nbsp;<input type=\"radio\" name=\"optradio\">  "+cadena.registro[i].Respuestas[j]+"</div>");
      }
      document.write("</div></div></div>");
      }
</script> </body> </html>

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Adan,

tu problema parece estar al principio en la definición de permisos CORDs del header.

Estás haciendo:

if (isset($_SERVER['HTTP_ORIGIN'])) {
  header("Access-Control-Allow-Origin: *");
  header('Access-Control-Allow-Credentials: true');
  header('Access-Control-Max-Age: 86400');
}

Es decir, si vienen datos del origen de la petición, le ponés *, y si no vienen, no hacés nada.

Lo que deberías hacer es que si vienen datos del origen de la petición, se usen, y si no se usen, probar con *. Sería así:

if (isset($_SERVER['HTTP_ORIGIN'])) {
   header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
} else {
      header("Access-Control-Allow-Origin: \"*\"");
}
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');

...

Esto asumiendo que en $_SERVER['HTTP_ORIGIN'] recibís los datos de la IP originante de la petición cruzada.

La idea es usar Access-Control-Allow-Origin: * lo menos posible, porque hay navegadores que ya no permiten ser tan permisivo con las llamadas desde diferentes originantes. https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

No podés directamente cambiar la configuración del servidor web para que acepte las peticiones CORs? ESto sería una solución definitiva y multiplataforma que no implica ni una línea de código: http://enable-cors.org/server_apache.html

Saludos cordiales

0voto

AdanCervera comentado

Muchas gracias Leonardo;
Ya pude obtener el valor de mis variables anexare el codigo por si alguien llega a tener el problema ya este mi solucion y pueda serle util.
data.php

<?php                                                                                           include_once('libros.php');                                                                  $libros = new libros();                                                                       $varios = $libros->getJSONDatos();                                                            $varios2= (string)$varios;                                                                    $arr = json_decode($varios);                                                                  echo $_GET['callback']."(".$varios.");";  // 09/01/12 corrected the statement                ?>  

archivo.html
<script type="text/javascript">
var cadena;
var msj = "Cargando";
//OBTENER JSON
$.ajax({
url : "http://192.168.0.22:8081/JSON/datos.php",
dataType: 'jsonp',
success:function(h){
// do stuff with json (in this case an array)
alert("Success");
alert(h);
cadena = h;
alert(cadena.status);
},
error:function(){
alert("Error");
}
});
//OBTENER JSON
alert(msj);
alert(cadena);

//PINTAR PREGUNTAS
for( var i = 0; i < cadena.registro.length; i++ ) {
document.write("<div class=\"panel panel-default\"><div class=\"panel-heading\">"+
cadena.registro[i].Pregunta + "</div> <div class=\"panel-body\">");
for( var j = 0; j < cadena.registro[i].Respuestas.length; j++ )
{
document.write(" <div class=\"radio\">  <input type=\"radio\" name=\"optradio\"> "+cadena.registro[i].Respuestas[j]+"</div>");
}
document.write("</div></div></div>");
}

//PINTAR PREGUNTAS
</script>

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta