JSONP là gì và tại sao nó được tạo ra? (ok)

https://helpex.vn/question/jsonp-la-gi-va-tai-sao-no-duoc-tao-ra--5cb02221ae03f645f4201505

Giả sử bạn đang ở trong domain example.com và bạn muốn gửi yêu cầu đến domain example.net. Để làm như vậy, bạn cần vượt qua các ranh giới miền, không có trong hầu hết các trình duyệt.

Mục duy nhất bỏ qua giới hạn này là thẻ <script>. Khi bạn sử dụng thẻ tập lệnh, giới hạn tên miền bị bỏ qua, nhưng trong các trường hợp thông thường, bạn thực sự không thể làm gì với kết quả, tập lệnh sẽ được đánh giá.

Nhập JSONP. Khi bạn thực hiện yêu cầu của mình đến một máy chủ được bật JSONP, bạn sẽ chuyển một tham số đặc biệt cho máy chủ biết một chút về trang của bạn. Bằng cách đó, máy chủ có thể kết thúc tốt đẹp phản hồi của nó theo cách mà trang của bạn có thể xử lý.

Ví dụ: giả sử máy chủ mong đợi một tham số gọi là "gọi lại" để kích hoạt các khả năng JSONP của nó. Sau đó, yêu cầu của bạn sẽ như sau:

http://www.example.net/sample.aspx?callback=mycallback

Không có JSONP, điều này có thể trả về một số đối tượng JavaScript cơ bản, như vậy:

{ foo: 'bar' }

Tuy nhiên, với JSONP, khi máy chủ nhận được tham số "gọi lại", nó sẽ kết quả khác đi một chút, trả về một cái gì đó như thế này:

mycallback({ foo: 'bar' });

Như bạn có thể thấy, bây giờ nó sẽ gọi phương thức bạn đã chỉ định. Vì vậy, trong trang của bạn, bạn xác định chức năng gọi lại:

mycallback = function(data){  alert(data.foo);};

Và bây giờ, khi tập lệnh được tải, nó sẽ được đánh giá và chức năng của bạn sẽ được thực thi. Voila, yêu cầu tên miền chéo!

Điều đáng chú ý là một vấn đề lớn với JSONP: bạn mất rất nhiều quyền kiểm soát yêu cầu. Ví dụ, không có cách "đẹp" nào để lấy lại mã lỗi phù hợp. Kết quả là, bạn kết thúc việc sử dụng bộ hẹn giờ để theo dõi yêu cầu, v.v., điều này luôn có một chút nghi ngờ. Đề xuất cho JSONRequest là một giải pháp tuyệt vời để cho phép tập lệnh miền chéo, duy trì bảo mật và cho phép kiểm soát đúng yêu cầu.

Những ngày này (2015), CORS là cách tiếp cận được đề xuất so với JSONRequest. JSONP vẫn hữu ích cho hỗ trợ trình duyệt cũ hơn, nhưng với ý nghĩa bảo mật, trừ khi bạn không có lựa chọn nào, CORS là lựa chọn tốt hơn.

Last updated

Navigation

Lionel

@Copyright 2023