2012-11-19 25 views
5

Tôi là một tân binh về phát triển web và sau rất nhiều khó khăn thông qua web, tôi đã đi đến một giải pháp. Tôi đang chia sẻ nó vì tôi cảm thấy nó không được tài liệu thực sự tốt và có thể được người khác sử dụng và vì tôi cần một số phản hồi.Làm thế nào để thiết lập chính sách tên miền chéo thực sự với mùa xuân và jquery

Tôi muốn cấp quyền truy cập tên miền cụ thể cho API.

Trước hết, tôi đã cố gắng đặt tiêu đề của yêu cầu nhưng nó không hoạt động chút nào vì hai lý do.

Lý do đầu tiên là tôi đã không cho phép nó trong crossdomain.xml:

<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> 
      <allow-http-request-headers-from domain="domain1WithoutSlashAtTheEnd" headers="*"/> 
      <allow-http-request-headers-from domain="domain2WithoutSlashAtTheEnd" headers="*"/> 
    </cross-domain-policy> 

Lý do thứ hai là tôi đã cố gắng để thiết lập các "access-control-phép-gốc" tiêu đề khi nó vô dụng. Bất kỳ tiêu đề tùy chỉnh nào như thế này đều bị bỏ qua. Trên thực tế, máy chủ không cần bất cứ điều gì thuộc loại đó và hành vi mặc định của ông cho phép tôi để có được nguồn gốc (tên miền) của cuộc gọi mà tôi đã có thể xử lý nó trong một bộ lọc như sau:

String origin = hsRequest.getHeader("Origin"); 
    if (allowedDomainList.contains(origin)) { 
     hsResponse.setHeader("Access-Control-Allow-Origin", origin); 
    } else { 
     throw new SomeException("domain not allowed"); 
    } 

nơi " allowedDomainList "là danh sách Chuỗi trong đó tôi cung cấp tất cả các miền mà tôi cho phép truy cập vào API của mình. Dường như hoạt động tốt. Bạn nghĩ gì về nó? Bạn có thể cụ thể hơn về:

headers="*" 

Có thể chỉ nói "Access-Control-Allow-Origin". Sau đó, tôi đã thấy rằng có một thuộc tính "an toàn" và tôi không biết phải làm gì với nó.

Tôi cũng có một vấn đề với mã mà tôi đã có:

<!DOCTYPE cross-domain-policy 
    SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
     <cross-domain-policy> 
     <allow-access-from domain="*" /> 
     </cross-domain-policy> 

Và tôi tự hỏi làm thế nào nó có thể interfer với hành vi của chính sách của tôi. Dường như nó không có tác động nhưng crossdomain.xml không rõ ràng với tôi.

Điểm cuối cùng là về jQuery (http://api.jquery.com/jQuery.ajax/). Tại sao jQuery có một điều để thiết lập các tiêu đề nếu chúng ta không thể có được chúng ở phía máy chủ? Thêm vào đó, nó có hai cách "đưa ra" các tiêu đề: sử dụng "beforeSend" và "headers". 2 điểm này không có ý nghĩa với tôi và như bạn có thể thấy ở trên, nó làm tôi mất rất nhiều thời gian cho không có gì cuối cùng!

Cảm ơn bạn đã trả lời!

+1

Nếu bạn đang liên lạc giữa iFrames và không quan tâm đến IE6 & 7, bạn có thể sử dụng 'postMessage()' mới. https://developer.mozilla.org/en-US/docs/DOM/window.postMessage –

+0

String origin = hsRequest.getHeader ("Nguồn gốc"); \t \t \t if (allowedDomainList.contains (gốc)) { \t \t \t \t hsResponse.setHeader ("Access-Control-Allow-Origin", nguồn gốc); \t \t \t} người khác { \t \t \t \t trở về; \t \t \t} – user1835565

+0

Ở trên, hiệu chỉnh của riêng tôi. Vẫn đang thử nghiệm. Tôi không muốn sử dụng iframe, tôi muốn miền bên ngoài chịu trách nhiệm 100% đối với mã của anh ấy. Tôi chỉ cung cấp các chức năng của máy chủ. – user1835565

Trả lời

1

Thay vì suy nghĩ về cách cho phép các miền cụ thể truy cập api của bạn, có thể các tên miền khác sẽ truy cập api của bạn khác nhau.

Nếu các miền khác thực hiện yêu cầu web từ máy chủ web thay vì ứng dụng khách của chúng, bạn sẽ không phải lo lắng về việc tạo kịch bản tên miền chéo.

Ứng dụng khách của miền khác có thể đăng lên máy chủ web của riêng nó, thực hiện yêu cầu web đến máy chủ của bạn và chuyển kết quả lại cho khách hàng của họ.

Ngoài ra, có nhiều cách để bảo mật api của bạn mà không cần duy trì danh sách các miền có quyền truy cập nếu bạn lo lắng về bảo mật.

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