我正在使用curl调用我的一个API,如下所示(交叉原点)。
curl -H "Origin: foo.com" -H "Content-Type: application/json" -H "Authorization: Basic YWRtaW46YWRtaW4=" -v https://localhost:9443/api/v10/configs -k
我没有在服务器端设置必要的跨源头。但API调用有效。那是为什么?
在服务器端API类上,在选项调用中我只设置了Allow标头。
@OPTIONS
public Response options() {
return Response.ok().header(HttpHeaders.ALLOW, "GET").build();
}
未设置以下标头。
Access-Control-Allow-Methods:
Access-Control-Allow-Origin:
Access-Control-Allow-Headers:
答案 0 :(得分:1)
CORS是一种启用跨域请求的机制,但在浏览器中使用AJAX。如果你使用curl,你可以做你想做的事情; - )
因此,在您的情况下(使用curl),您尝试在浏览器外执行请求。所以你可以自由地做你想做的事!使用curl,将始终执行请求,您将看到交换的标头,例如。这可能有助于查看您是否具有CORS的预期标题...
希望它可以帮到你, 亨利
答案 1 :(得分:0)
您可能需要阅读HTTP access control (CORS)以更好地了解其工作原理及其服务的主要目的。
只是一些进入代码段
出于安全原因,浏览器会限制从脚本中发起的跨源HTTP请求。例如,
XMLHttpRequest
遵循同源策略。因此,使用XMLHttpRequest
的Web应用程序只能向其自己的域发出HTTP请求。为了改进Web应用程序,开发人员要求浏览器供应商允许XMLHttpRequest
发出跨域请求。W3C Web应用程序工作组建议使用新的跨域资源共享(CORS)机制。 CORS为Web服务器提供跨域访问控制,从而实现安全的跨域数据传输。现代浏览器在API容器中使用CORS(例如
XMLHttpRequest
)来降低跨源HTTP请求的风险。
因此引入了CORS以允许在浏览器中进行跨域访问(来自脚本)。它是如何工作的,当一个请求需要跨域授权时,浏览器首先发出一个OPTIONS("预检")请求来查找访问响应头。如果他们在那里,那么它会提出初始请求。否则会出现请求错误。
顺便说一句,我会避免在资源方法中实现CORS支持。我会使用过滤机制,因此所有请求都在过滤器中处理,而不是必须为所有端点实现@OPTIONS
方法。