什麼是跨域資源共享 (CORS) – 如何將其添加到您的 Java Jersey Web 服務器?
已發表: 2014-07-19 如何在client-server
通信期間修復此錯誤? 服務器以 JSON 或 XML 格式發送數據,客戶端拋出以下異常。
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
常規網頁可以使用 XMLHttpRequest 對像從遠程服務器發送和接收數據,但它們受到同源策略的限制。 擴展並沒有那麼有限。 擴展程序可以與其源之外的遠程服務器通信,只要它首先請求跨域權限。
此外,如果您有以下問題,那麼您在正確的位置:
- 了解跨域資源共享(CORS 過濾器)
- 我可以使用跨域資源共享嗎
- 如何啟用跨域資源共享
- 什麼是跨域 Ajax 與跨域資源共享
- 什麼是 HTTP 訪問控制 (CORS)
CORS(跨源資源共享)是 W3C 支持的一種機制,用於在 Web 瀏覽器中啟用跨源請求。 CORS 需要瀏覽器和服務器的支持才能工作。 這是用於 Web 容器(例如 Apache Tomcat 和其他嵌入式 Web 服務器)的服務器端 CORS 的 Java Jersey Web 服務器過濾器實現。
第1步:
響應可以包含一個 Access-Control-Allow-Origin 標頭,以請求的來源作為值,以允許訪問資源的內容。 用戶代理驗證請求起源的值和來源是否匹配。
第2步:
用戶代理可以通過預檢請求發現跨域資源是否準備好接受來自給定源的請求,使用非簡單方法。 這再次由用戶代理驗證。
第 3 步:
服務器端應用程序可以通過 Origin 標頭髮現 HTTP 請求被用戶代理視為跨域請求。 此擴展使服務器端應用程序能夠對它們願意服務的跨域請求實施限制(例如,不返回任何內容)。
現在讓我們開始使用示例。
示例 1:Java Jersey Web 服務器
幾週前,我寫了一篇關於如何在 Java 應用程序啟動期間啟動嵌入式 HTTP Jersey 服務器的文章。 這篇文章將介紹如何將 CORS 過濾器添加到同一個 Jersey 服務器的步驟。
我們需要擴展 ContainerResponseFilter。 由容器響應過濾器實現的接口。 默認情況下,即如果沒有將名稱綁定應用於過濾器實現類,則過濾器實例將全局應用於任何傳出響應。
為了解決這個問題,讓我們嘗試在服務器響應中添加以下 4 個標頭:
- 訪問控制允許來源
- 訪問控制允許方法
- 訪問控制最大年齡
- 訪問控制允許標頭
CORS 過濾器代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
對上一教程的 JerseyEmbeddedHTTPServerCrunchify.java 中的修改。

只需在 createHttpServer() 中添加以下行並重新啟動服務器。
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
結果:
http://localhost:8085/api
這是標題詳細信息。
示例 2:Apache HTTP 服務器
要公開標頭,您可以在 <Directory>、<Location> 和 <Files> 部分或.htaccess
文件中添加以下行。
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
示例 3:.NET 服務器可以在 web.config 中配置它,如下所示
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
示例 4:對於 Jetty(7 及以上)
將 jetty-servlets JAR 包含到您的 WEB-INF/lib 中並將其合併到您的 WEB-INF/web.xml
1 2 3 4 5 6 7 8 |
< filter > < filter - name > cross - origin < / filter - name > < filter - class > org . eclipse . jetty . servlets . CrossOriginFilter < / filter - class > < / filter > < filter - mapping > < filter - name > cross - origin < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
示例 5:Apache Tomcat 服務器 (v 7.0.41 +)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
示例 6:在 PHP 中
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
如果您對此還有任何疑問,請告訴我。 在這裡可以找到所有 Java 教程的列表。