什么是跨域资源共享 (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 教程的列表。