什麼是跨域資源共享 (CORS) – 如何將其添加到您的 Java Jersey Web 服務器?

已發表: 2014-07-19

Crunchify 的跨域資源共享 (CORS) 教程

如何在client-server通信期間修復此錯誤? 服務器以 JSON 或 XML 格式發送數據,客戶端拋出以下異常。

常規網頁可以使用 XMLHttpRequest 對像從遠程服務器發送和接收數據,但它們受到同源策略的限制。 擴展並沒有那麼有限。 擴展程序可以與其源之外的遠程服務器通信,只要它首先請求跨域權限。

此外,如果您有以下問題,那麼您在正確的位置:

  1. 了解跨域資源共享(CORS 過濾器)
  2. 我可以使用跨域資源共享嗎
  3. 如何啟用跨域資源共享
  4. 什麼是跨域 Ajax 與跨域資源共享
  5. 什麼是 HTTP 訪問控制 (CORS)

CORS(跨源資源共享)是 W3C 支持的一種機制,用於在 Web 瀏覽器中啟用跨源請求。 CORS 需要瀏覽器和服務器的支持才能工作。 這是用於 Web 容器(例如 Apache Tomcat 和其他嵌入式 Web 服務器)的服務器端 CORS 的 Java Jersey Web 服務器過濾器實現。

Crunchify CORSFilter Jersey 服務器示例

第1步:

響應可以包含一個 Access-Control-Allow-Origin 標頭,以請求的來源作為值,以允許訪問資源的內容。 用戶代理驗證請求起源的值和來源是否匹配。

第2步:

用戶代理可以通過預檢請求發現跨域資源是否準備好接受來自給定源的請求,使用非簡單方法。 這再次由用戶代理驗證。

第 3 步:

服務器端應用程序可以通過 Origin 標頭髮現 HTTP 請求被用戶代理視為跨域請求。 此擴展使服務器端應用程序能夠對它們願意服務的跨域請求實施限制(例如,不返回任何內容)。

現在讓我們開始使用示例。

示例 1:Java Jersey Web 服務器

幾週前,我寫了一篇關於如何在 Java 應用程序啟動期間啟動嵌入式 HTTP Jersey 服務器的文章。 這篇文章將介紹如何將 CORS 過濾器添加到同一個 Jersey 服務器的步驟。

我們需要擴展 ContainerResponseFilter。 由容器響應過濾器實現的接口。 默認情況下,即如果沒有將名稱綁定應用於過濾器實現類,則過濾器實例將全局應用於任何傳出響應。

為了解決這個問題,讓我們嘗試在服務器響應中添加以下 4 個標頭:

  1. 訪問控制允許來源
  2. 訪問控制允許方法
  3. 訪問控制最大年齡
  4. 訪問控制允許標頭

CORS 過濾器代碼:

對上一教程的 JerseyEmbeddedHTTPServerCrunchify.java 中的修改。

只需在 createHttpServer() 中添加以下行並重新啟動服務器。

結果:

http://localhost:8085/api

使用 CORS 過濾器壓縮響應標頭

這是標題詳細信息。

在沒有 CORS 過濾器的情況下壓縮響應標頭

示例 2:Apache HTTP 服務器

要公開標頭,您可以在 <Directory>、<Location> 和 <Files> 部分或.htaccess文件中添加以下行。

示例 3:.NET 服務器可以在 web.config 中配置它,如下所示

示例 4:對於 Jetty(7 及以上)

將 jetty-servlets JAR 包含到您的 WEB-INF/lib 中並將其合併到您的 WEB-INF/web.xml

示例 5:Apache Tomcat 服務器 (v 7.0.41 +)

示例 6:在 PHP 中

如果您對此還有任何疑問,請告訴我。 在這裡可以找到所有 Java 教程的列表。