2010-10-27 3 views
18

У меня есть сайт с некоторыми страницами по соединению HTTPS. На этих страницах HTTPS я должен использовать HTTP-запрос Ajax для получения некоторых ошибок, таких как пустые поля. Но сообщения об ошибках не поступают. Есть ли какое-либо решение для этого, или я должен сделать этот запрос AJAX для подключения по протоколу HTTPS?HTTP-запрос Ajax через HTTPS Страница

+0

ajax должен нормально работать на https, можете ли вы опубликовать свой фактический фрагмент кода? – Manny

+1

Звучит как SOP (http://en.wikipedia.org/wiki/Same_origin_policy): схемы разные, поэтому это другое происхождение. –

+0

Спасибо за ответ. Я изменил свой сайт соответствующим образом. – cooldude

ответ

27

Это невозможно из-за Same Origin Policy.

Вам также необходимо переключить запросы Ajax на https.

+2

Даже рабочий проект совместного использования ресурсов Cross-Origin делает невозможным: http://www.w3.org/TR/cors/#user-agent-security – Harmen

+0

Спасибо за ответ всем. Я изменил свой сайт в соответствии с той же политикой происхождения. – cooldude

+0

@NickSotiros Зачем вам это не нужно? Существует нулевой недостаток, и HTTP-запросы на HTTPS-странице потенциально могут быть атакованы MITM для внедрения вредоносного JS. – ceejayoz

2

В некоторых случаях односторонний запрос без ответа может быть запущен на TCP-сервер без сертификата SSL. Сервер TCP, в отличие от HTTP-сервера, заставит вас запросить. Однако не будет доступа к каким-либо данным, отправленным из браузера, поскольку браузер не будет отправлять какие-либо данные без проверки положительного сертификата. И в особых случаях даже голый сигнал TCP без каких-либо данных достаточно для выполнения некоторых задач. Например, для устройства IoT в локальной сети для запуска подключения к внешней службе. Link

Это своего рода триггер «Wake Up», который работает на порте без какой-либо защиты.

В случае необходимости ответа это может быть реализовано с использованием защищенного общедоступного https-сервера, который может отправить необходимые данные обратно в браузер с использованием, например, WebSockets.

1

Тем не менее, это может быть сделано с помощью следующих шагов:

  1. отправить запрос Ajax HTTPS на веб-сайте (тот же домен)

    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. получить AJAX запрос, для например, php и сделать запрос CURL на любой желаемый веб-сайт через http.

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

Без решения на стороне сервера, Theres только один способ, в котором защищенная страница может получить что-то из незащищенной страницы/запроса и что думала PostMessage и всплывающее

Я сказал всплывающее окно Потому что сайту запрещено смешивать контент. Но всплывающее меню не смешивается. У этого есть свое собственное окно, но он все еще может общаться с новичком с postMessage.

Таким образом, вы можете открыть новый HTTP-страницу с window.open(...) и есть, что делает запрос для вас (то есть, если сайт использует CORS а)


XDomain пришел на ум, когда я писал но здесь это современный подход с использованием нового fetch api, преимущество потокового больших файлов, недостатком является то, что она не будет работать во всех браузере

Вы помещаете этот прокси-скрипт на любой странице 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() 
    }) 
} 

Затем открыть всплывающее окно на странице HTTPS (обратите внимание, что вы можете сделать это только на случае взаимодействия с пользователем или иначе он будет заблокирован)

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

создать свою функцию полезности

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)) 
    } 
    }) 
} 

И сделать запрос, как вы обычно делаете с выборкой апи

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

с JavaScript Я попытался из нескольких способов и я не мог.

Вам нужно решение на стороне сервера, например, на C#. Я создал контроллер, который вызывает http, en deserialize, и результат заключается в том, что когда я вызываю из javascript, я делаю запрос от моего https://domain в мой htpps: // домен. Пожалуйста, смотрите мои 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); 
    } 

И позвольте мне показать вам мою сторону клиента (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) + '' 
      ); 

     });  

}); 

Я желаю, что это поможет вам! Приветствия