2009-10-07 19 views
5

Trước đây, Kết nối Bạn bè của Google yêu cầu người dùng tải lên một vài tệp vào trang web của họ để cho phép liên lạc giữa nhiều miền và Facebook Connect vẫn yêu cầu bạn tải lên một tệp để bật tệp đó.Kết nối Bạn bè của Google thực hiện giao tiếp tên miền chéo như thế nào mà không cần phải tải tệp lên miền của khách hàng?

Hiện tại, Kết nối Bạn bè không yêu cầu bất kỳ tệp tải lên nào ... Tôi đã tự hỏi làm cách nào họ có thể thực hiện việc này.

tham khảo: http://www.techcrunch.com/2009/10/02/easy-does-it-google-friend-connect-one-ups-facebook-connects-install-wizard/

Trả lời

0

Tôi không chắc chắn như thế nào nó hoạt động trong trường hợp đặc biệt này, nhưng tin nhắn cross-domain có thể được thực hiện bằng cách các postMessage() API hoặc bằng cách thay đổi một phần băm của URL và giám sát cái đó.

Phương thức thay đổi hàm băm hoạt động vì cả hai trang kèm theo và kèm theo đều có quyền truy cập vào URL của trang đính kèm.

Tất nhiên, hy vọng cuộc gọi API postMessage() trở nên chuẩn hơn theo thời gian.

+0

Tài liệu kèm theo không có quyền truy cập vào URL tài liệu đính kèm, nó có quyền truy cập _write_ vào thuộc tính 'vị trí' của nó. –

+0

Thú vị. Cảm ơn bạn đã làm rõ. –

4

< chỉnh sửa> Rất khó nhớ/xác minh ngay bây giờ, nhưng tôi tin rằng câu trả lời của tôi ở đây có thể không chính xác. Câu trả lời của Sean Kinsey ở trên là câu trả lời cuối cùng cho câu hỏi này. Nếu bạn đang đọc này, xin vui lòng upvote câu trả lời của mình và bỏ qua của tôi. </edit>

Tiện ích Kết nối Bạn bè của Google hoạt động giống như hầu hết các quảng cáo/tiện ích, sử dụng đoạn trích HTML để sao chép JavaScript bao gồm trên máy chủ của máy chủ, sau đó tạo iframe chứa nội dung mong muốn. Bằng cách mở khung nội tuyến có ID trang web của bạn trong URL, máy chủ của Google có thể tạo tài liệu HTML thích hợp để đại diện cho tiện ích Kết nối Bạn bè cho trang web/cài đặt cụ thể của bạn.

Không có bất kỳ giao tiếp chéo trang nào xảy ra ngoài bước ban đầu của việc tạo khung nội tuyến với mục tiêu URL phù hợp. Mọi thứ bên trong iframe được tạo động của tiện ích giống như người dùng đã truy cập một trang riêng trên máy chủ của Google, nhưng những gì sẽ được hiển thị sau đó được nhúng/cô lập trong một khối trên trang của bạn thay thế.

+0

Điều này không chính xác - Kết nối Bạn bè của Google dựa trên khung công tác OpenSocial tạo điều kiện cho mô hình pub/sub và những thứ như tự động thay đổi kích thước của iframe để phù hợp với nội dung của nó. Nó theo nghĩa đen dựa trên XDM :) –

+0

Thật đáng xấu hổ rằng nó thực sự là một câu trả lời sai lầm được trao giải thưởng ... –

0

JSON cho phép javascript tên miền chéo.

  • Do giới hạn bảo mật của trình duyệt, hầu hết các yêu cầu "Ajax" phải tuân thủ chính sách gốc tương tự; yêu cầu không thể truy xuất thành công dữ liệu từ tên miền, tên miền phụ, hoặc giao thức khác.
  • Kịch bản lệnh và JSONP yêu cầu không tuân theo cùng các giới hạn chính sách gốc .
+1

JSON là định dạng. Jquery sẽ trỏ đến url bằng thẻ script (được tạo khi đang di chuyển). Kịch bản được mong đợi để gọi một hàm gọi lại cụ thể để nhận được phản hồi. Nó vẫn phải tuân thủ chính sách gốc vì nó không thể đọc nội dung của yêu cầu trang. http://devlicio.us/blogs/scott_seely/archive/2010/09/07/how-jsonp-works-and-some-bits-about-implementing-it-in-wcf.aspx – h3xStream

+0

JSONP không thể so sánh được với postMessage hoặc các kỹ thuật Nhắn tin Tài liệu Chéo khác vì nó thực sự là trung tâm khách hàng-máy chủ hơn là trung tâm khách hàng như những người khác. Với JSONP bạn không thể tạo điều kiện cho hai chương trình javascript 'nói chuyện' với nhau, chỉ một Chương trình và một máy chủ. –

0

Không có phương pháp nào khác ngoài cách sử dụng somewindow.postMessage(); để liên lạc giữa iframe nhiều miền.

Trước khi somewindow.postMessage() bạn phải tải tệp lên để đảm bảo rằng bạn có thể thiết lập liên lạc giữa iframe.

dụ:

 <html> 
<!-- this is main domain www.example.com --> 
     <head> 
     </head> 
     <body> 
     <iframe src="http://www.exampleotherdomain.com/"> 
     <script> 
     function sendMsg(a) { 

     var f = document.createElement('iframe'), 
      k = document.getElementById('ifr'); 

      f.setAttribute('src', 'http://www.example.com/xdreciver.html#myValueisSent'); 
      k.appendChild(f); 
      k.removeChild(f); 
     } 
     </script> 


     <div id="ifr"></div> 
     </iframe> 
     </body> 
     </html> 

nay là nội dung http://www.example.com/xdreciver.html html:

 <html> 
<!-- this is http://www.example.com/xdreciver.html --> 
     <head> 
     <script> 
     function getMsg() { 

      return window.location.hash; 
     } 
     </script> 
     </head> 
     <body onload="var msg = getMsg(); alert(msg);"> 



     </body> 
     </html> 

Đối với việc sử dụng .postMessage(); đủ để sử dụng top.postMessage('my message to other domain document, which is also the main document', 'http://www.theotherdomain.com');

+0

Như đã đề cập trong câu trả lời của tôi, có khá nhiều tùy chọn cho XDM hơn postMessage và FIM :) –

6

Có nhiều phương thức giao tiếp giữa các tài liệu trên các miền khác nhau, trong số các postMessage HTML5, NIX, FIM (băm/đoạn), frameElement và bằng cách sử dụng thuộc tính window.name.

Các tính năng này có sẵn trên các trình duyệt khác nhau và trong các phiên bản khác nhau, nhưng chúng cho phép bạn thực hiện XDM đáng tin cậy (nhắn tin tên miền chéo). Một dự án đã thực hiện điều này trước đó là Apache Shindig, có lẽ đã đi tiên phong trong một vài trong số này, và gần đây hơn, dự án easyXDM đã đến, thống nhất tất cả các phương pháp này với một API chung, giúp dễ dàng tạo phức tạp các ứng dụng sử dụng XDM và RPC.

Bạn có thể đọc chuyên sâu về các phương pháp vận chuyển dữ liệu khác nhau trong this article at Script Junkie.

Bây giờ, để trả lời câu hỏi của bạn trực tiếp, trước đó bạn có thể tin rằng chỉ có postMessage, FIM (Fragment Identifier Messaging) có sẵn, và để làm việc hiệu quả, thường phải tải lên một đặc biệt tệp vào miền của bạn. Như nhiều phương pháp đã được phát hiện, điều này đã được nhiều người không được chấp nhận như là một kỹ thuật, và do đó; không cần thiết cho tập tin.

Chỉ để ghi lại; Tôi là tác giả của cả bài viết về Script Junkie, và thư viện easyXDM (đó là những gì Twitter, Disqus và một số khác đang sử dụng bằng cách này).

+0

+1. Một người nào đó đã downvoted câu trả lời của tôi sau khi tất cả những năm này và tôi chỉ nhận thấy điều này. Tôi chắc rằng ít nhất tôi cũng phải xem xét cách Friend Connect hoạt động vào thời điểm đó, nhưng chắc hẳn đã bỏ lỡ chút này của hệ thống ống nước. Tôi sẽ cập nhật câu trả lời của tôi để làm rõ rằng bạn là/đã đúng. –

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