我正在使用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:
CORS是一种启用跨域请求的机制,但在浏览器中使用AJAX。如果你使用curl,你可以随心所欲;-)
因此,在您的情况下(使用curl),您尝试在浏览器之外执行请求。所以你可以自由地做你想做的事!使用curl,请求将始终被执行,例如,您将看到交换的头。这可能有助于查看您是否有CORS的预期标头。。。
希望它能帮助你,Thierry
您可能需要阅读HTTP访问控制(CORS),以更好地了解它的工作原理及其服务的主要目的。
只是一些片段
出于安全原因,浏览器会限制从脚本中发起的跨源HTTP请求。例如,
XMLHttpRequest
遵循同源策略。因此,使用XMLHttpRequest
的web应用程序只能向自己的域发出HTTP请求。为了改进web应用程序,开发人员要求浏览器供应商允许XMLHttpRequest
进行跨域请求。W3C Web应用程序工作组建议采用新的跨来源资源共享(CORS)机制。CORS为web服务器提供跨域访问控制,从而实现安全的跨域数据传输。现代浏览器在API容器(如
XMLHttpRequest
)中使用CORS来降低跨源HTTP请求的风险。
因此引入CORS是为了允许浏览器中的跨域访问(从脚本)。它的工作原理是,当发出需要跨域授权的请求时,浏览器首先发出OPTIONS("preflight")请求以查找访问响应标头。如果他们在那里,那么它会发出最初的请求。否则会出现请求错误。
顺便说一句,我会避免在资源方法中实现CORS支持。相反,我会使用过滤器机制,以便在过滤器中处理所有请求,而不必为所有端点实现@OPTIONS
方法。