2010-10-27 53 views
18

Tôi đang có trang web có một số trang kết nối HTTPS. Từ các trang HTTPS này, tôi phải sử dụng một yêu cầu HTTP Ajax để truy xuất một số lỗi như các trường trống. Nhưng thông báo lỗi này không đến. Có bất kỳ giải pháp cho nó hoặc tôi phải làm cho rằng AJAX yêu cầu để nộp trên kết nối HTTPS?Yêu cầu HTTP Ajax qua HTTPS Trang

+0

ajax sẽ chạy tốt trên https, bạn có thể đăng đoạn mã thực tế của mình không? – Manny

+1

Âm thanh như SOP (http://en.wikipedia.org/wiki/Same_origin_policy): các lược đồ khác nhau, vì vậy nó là một nguồn gốc khác. –

+0

Cảm ơn câu trả lời. Tôi đã thay đổi trang web của mình cho phù hợp. – cooldude

Trả lời

27

Điều này là không thể do Same Origin Policy.

Bạn cũng sẽ cần chuyển yêu cầu Ajax sang https.

+2

Ngay cả bản thảo làm việc của Chia sẻ nguồn gốc chéo cũng không thể thực hiện được: http://www.w3.org/TR/cors/#user-agent-security – Harmen

+0

Cảm ơn bạn đã trả lời tất cả mọi người. Tôi đã thay đổi trang web của mình theo cùng một chính sách gốc. – cooldude

+0

@NickSotiros Tại sao bạn không muốn nó an toàn? Không có nhược điểm nào và các yêu cầu HTTP trên một trang HTTPS có thể bị tấn công bởi một MITM để tiêm JS độc hại. – ceejayoz

2

Trong một số trường hợp, yêu cầu một chiều không có phản hồi có thể được kích hoạt đến máy chủ TCP, không có chứng chỉ SSL. Máy chủ TCP, trái ngược với máy chủ HTTP, sẽ bắt bạn yêu cầu. Tuy nhiên, sẽ không có quyền truy cập vào bất kỳ dữ liệu nào được gửi từ trình duyệt, bởi vì trình duyệt sẽ không gửi bất kỳ dữ liệu nào mà không có kiểm tra chứng chỉ tích cực. Và trong trường hợp đặc biệt, ngay cả một tín hiệu TCP trần mà không có bất kỳ dữ liệu nào cũng đủ để thực thi một số tác vụ. Ví dụ cho một thiết bị IoT trong mạng LAN để bắt đầu kết nối với một dịch vụ bên ngoài. Link

Đây là loại trình kích hoạt "Wake Up", hoạt động trên cổng không có bảo mật.

Trong trường hợp phản hồi là cần thiết, điều này có thể được triển khai bằng máy chủ https công cộng được bảo mật, có thể gửi dữ liệu cần thiết về trình duyệt bằng cách sử dụng ví dụ: Websockets.

1

Tuy nhiên, điều này có thể được thực hiện với các bước sau:

  1. gửi một yêu cầu ajax https để trang web của bạn (cùng một tên miền)

    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. được yêu cầu ajax, cho ví dụ, bởi php, và làm cho một CURL nhận được yêu cầu đến bất kỳ trang web mong muốn thông qua http.

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

Nếu không có bất kỳ giải pháp phía máy chủ, Theres chỉ là một cách thức mà một trang an toàn có thể nhận được một cái gì đó từ một trang không an toàn/yêu cầu và đó là nghĩ postMessage và một popup

tôi đã nói bật lên cuz trang web không được phép trộn nội dung. Nhưng một popup không thực sự trộn lẫn. Nó có cửa sổ riêng nhưng vẫn có thể giao tiếp với trình mở bằng postMessage.

Vì vậy, bạn có thể mở một mới http-page với window.open(...) và có mà đưa ra yêu cầu cho bạn (có nghĩa là nếu trang web đang sử dụng CORS cũng)


XDomain đến tâm trí khi tôi viết này nhưng đây là một cách tiếp cận hiện đại bằng cách sử dụng mới fetch api, lợi thế là streaming các tập tin lớn, nhược điểm là nó sẽ không làm việc trong tất cả các trình duyệt

Bạn đặt kịch bản proxy này trên bất kỳ trang 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() 
    }) 
} 

Sau đó, bạn mở một cửa sổ popup trong trang https (lưu ý rằng bạn chỉ có thể làm điều này trên một sự kiện tương tác người dùng hoặc nếu không nó sẽ bị chặn)

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

tạo chức năng hữu ích của bạn

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

Và thực hiện yêu cầu như bạn thường làm với lấy api

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

từ javascript tôi đã cố gắng từ nhiều cách và tôi không thể.

Bạn cần một giải pháp phía máy chủ, ví dụ trên C# Tôi đã tạo bộ điều khiển gọi đến http, vi deserialize đối tượng và kết quả là khi tôi gọi từ javascript, tôi đang thực hiện yêu cầu từ https://domain vào miền htpps: // của tôi. Xin vui lòng xem C# mã của tôi:

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

Và hãy để tôi chỉ cho bạn phía khách hàng của tôi (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) + '' 
      ); 

     });  

}); 

Tôi mong rằng điều này giúp bạn! Chúc mừng

Các vấn đề liên quan