2010-10-27 35 views
18

Tengo un sitio con algunas páginas en conexión HTTPS. De estas páginas HTTPS, tengo que usar una solicitud HTTP Ajax para recuperar algunos errores, como campos en blanco. Pero estos mensajes de error no están llegando. ¿Hay alguna solución o tengo que hacer esa solicitud AJAX para archivar en la conexión HTTPS?HTTP Solicitud Ajax a través de HTTPS Página

+0

ajax debería funcionar bien en https, ¿puede publicar el fragmento de código real? – Manny

+1

Suena como SOP (http://en.wikipedia.org/wiki/Same_origin_policy): los esquemas son diferentes, por lo que es un origen diferente. –

+0

Gracias por la respuesta. He cambiado mi sitio web en consecuencia. – cooldude

Respuesta

27

Esto no es posible debido a Same Origin Policy.

Deberá cambiar las solicitudes de Ajax a https, también.

+2

Incluso el borrador de trabajo de Intercambio de recursos de origen cruzado lo hace imposible: http://www.w3.org/TR/cors/#user-agent-security – Harmen

+0

Gracias por la respuesta a todos. Cambié mi sitio web de acuerdo con la misma política de origen. – cooldude

+0

@NickSotiros ¿Por qué no quieres que sea seguro? No hay cero inconveniente, y las solicitudes HTTP en una página HTTPS podrían ser atacadas por un MITM para inyectar JS malicioso. – ceejayoz

2

En algunos casos, una solicitud de un solo sentido sin respuesta se puede iniciar en un servidor TCP, sin un certificado SSL. Un servidor TCP, a diferencia de un servidor HTTP, atrapará su solicitud. Sin embargo, no habrá acceso a ningún dato enviado desde el navegador, ya que el navegador no enviará ningún dato sin una verificación de certificado positiva. Y en casos especiales, incluso una señal TCP sin datos es suficiente para ejecutar algunas tareas. Por ejemplo, para que un dispositivo IoT dentro de una LAN inicie una conexión a un servicio externo. Link

Se trata de una especie de disparador de "Despertar", que funciona en un puerto sin ninguna seguridad.

En caso de que se necesite una respuesta, esto se puede implementar utilizando un servidor https público seguro, que puede enviar los datos necesarios de vuelta al navegador usando p. Ej. Websockets.

1

Sin embargo, esto se puede hacer con los siguientes pasos:

  1. enviar una petición AJAX https a su sitio web (el mismo dominio)

    jQuery.ajax({ 
        'url'  : '//same_domain.com/ajax_receiver.php', 
        'type'  : 'get', 
        'data'  : {'foo' : 'bar'}, 
        'success' : function(response) { 
         console.log('Successful request'); 
        } 
    }).fail(function(xhr, err) { 
        console.error('Request error'); 
    }); 
    
  2. petición GET Ajax, para ejemplo, por php, y haga una solicitud de obtención de CURL a cualquier sitio web deseado a través de http.

    use linslin\yii2\curl; 
    $curl = new curl\Curl(); 
    $curl->get('http://example.com'); 
    
3

Sin ningún tipo de solución del lado del servidor, Theres es sólo una manera en la que una página segura puede obtener algo de una página/solicitud insegura y que cree postMessage y una ventana emergente

dije emergente primo el sitio no tiene permitido mezclar contenido. Pero una ventana emergente no se está mezclando realmente. Tiene su propia ventana pero aún puede comunicarse con el abridor con postMessage.

para que pueda abrir un nuevo http páginas con window.open(...) y tienen que hacer la solicitud en su nombre (es decir, si está usando el sitio CORS así)


XDomain vino a la mente cuando escribí esto pero aquí es un enfoque moderno utilizando la nueva fetch api, la ventaja es la transmisión de archivos de gran tamaño, el inconveniente es que no va a funcionar en todos los navegadores

poner esto script de proxy en cualquier página http

onmessage = evt => { 
    const port = evt.ports[0] 

    fetch(...evt.data).then(res => { 
    // the response is not clonable 
    // so we make a new plain object 
    const obj = { 
     bodyUsed: false, 
     headers: [...res.headers], 
     ok: res.ok, 
     redirected: res.redurected, 
     status: res.status, 
     statusText: res.statusText, 
     type: res.type, 
     url: res.url 
    } 

    port.postMessage(obj) 

    // Pipe the request to the port (MessageChannel) 
    const reader = res.body.getReader() 
    const pump =() => reader.read() 
    .then(({value, done}) => done 
     ? port.postMessage(done) 
     : (port.postMessage(value), pump()) 
    ) 

    // start the pipe 
    pump() 
    }) 
} 

A continuación, se abre una ventana emergente en su página https (tenga en cuenta que sólo se puede hacer esto en un evento de interacción del usuario o de lo contrario será bloqueado)

window.popup = window.open(http://.../proxy.html) 

crear su función de utilidad

function xfetch(...args) { 
    // tell the proxy to make the request 
    const ms = new MessageChannel 
    popup.postMessage(args, '*', [ms.port1]) 

    // Resolves when the headers comes 
    return new Promise((rs, rj) => { 

    // First message will resolve the Response Object 
    ms.port2.onmessage = ({data}) => { 
     const stream = new ReadableStream({ 
     start(controller) { 

      // Change the onmessage to pipe the remaning request 
      ms.port2.onmessage = evt => { 
      if (evt.data === true) // Done? 
       controller.close() 
      else // enqueue the buffer to the stream 
       controller.enqueue(evt.data) 
      } 
     } 
     }) 

     // Construct a new response with the 
     // response headers and a stream 
     rs(new Response(stream, data)) 
    } 
    }) 
} 

Y hacer la solicitud como lo hace normalmente con la API fetch

xfetch('http://httpbin.org/get') 
    .then(res => res.text()) 
    .then(console.log) 
0

desde el javascript traté de varias maneras y no pude

Necesita una solución del lado del servidor, por ejemplo, en C# Creé un controlador que llame al http, deserialice el objeto, y el resultado es que cuando llamo desde javascript, estoy haciendo una solicitud de mi https://domain a mi htpps: // dominio. Por favor, vea mi código C#:

[Authorize] 
public class CurrencyServicesController : Controller 
{ 
    HttpClient client; 
    //GET: CurrencyServices/Consultar?url=valores?moedas=USD&alt=json 
    public async Task<dynamic> Consultar(string url) 
    { 
     client = new HttpClient(); 
     client.BaseAddress = new Uri("http://api.promasters.net.br/cotacao/v1/"); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
     System.Net.Http.HttpResponseMessage response = client.GetAsync(url).Result; 

     var FromURL = response.Content.ReadAsStringAsync().Result; 

     return JsonConvert.DeserializeObject(FromURL); 
    } 

Y permítanme muestro mi lado del cliente (Javascript)

<script async> 
$(document).ready(function (data) { 

    var TheUrl = '@Url.Action("Consultar", "CurrencyServices")?url=valores'; 
    $.getJSON(TheUrl) 
     .done(function (data) { 
      $('#DolarQuotation').html(
       '$ ' + data.valores.USD.valor.toFixed(2) + ',' 
      ); 
      $('#EuroQuotation').html(
       '€ ' + data.valores.EUR.valor.toFixed(2) + ',' 
      ); 

      $('#ARGPesoQuotation').html(
       'Ar$ ' + data.valores.ARS.valor.toFixed(2) + '' 
      ); 

     });  

}); 

Me gustaría que esto le ayudará! Saludos

Cuestiones relacionadas