我对它是如何工作的有一个大致的想法。如果请求的源头有效(允许),则返回相同的ORIGIN值
但我不知道:
(更多详细信息,因为“当请求的凭据模式为“include”时,响应中的“Access Control Allow Origin”头的值不能是通配符“*”,所以我需要请求中的原始值放回响应中。
如果不允许使用ORIGIN,我应该退回什么?
根本不包括访问控制允许原点标头?
或setHeader(“访问控制允许原点”),或setHeader(“访问控制允许原点”,“null”)?
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
String origin = requestContext.getHeaderString("Origin");
String origin = requestContext.getHeaderString("Origin");
URL originUrl = null;
try {
if (StringUtils.hasText(origin)) {
originUrl = new URL(origin);
Pattern hostAllowedPattern = Pattern.compile("(.+\\.)*mydomain\\.com", Pattern.CASE_INSENSITIVE);
if (hostAllowedPattern.matcher(originUrl.getHost()).matches()) {
headers.add("Access-Control-Allow-Origin", origin);
} else {
headers.add("Access-Control-Allow-Origin", "");
}
headers.add("Vary", "Origin");
}
headers.add("Access-Control-Allow-Credentials", "true");
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers",
对于OPTIONS请求之后的实际请求,是否需要包含与我为飞行前请求返回给客户端的完全相同的Access Control Allow Origin头?
是的,也就是说,如果您发回的是实际的原点值而不是“*
”通配符,并且该原点值是导致选项
请求成功的原因。因为如果发回的非通配符原点值与选项
成功返回的值不同,则会导致浏览器阻止客户端代码访问响应(因为实际原点不匹配)。
服务器代码是否只需要在实际请求中存在“ORIGIN”头时执行此操作?
是的,因为当浏览器中运行的前端JavaScript代码使用XHR或从某个JavaScript库获取API或Ajax方法来发出跨源请求时,浏览器总是向请求添加origin
头。而访问控制允许源代码
仅由浏览器使用。
因此,向没有在请求中发送Origin
的非浏览器工具发送回Access-Control-允许-Origin
是没有意义的-在这种情况下,您发送的只是浪费字节。
当然,有些人可以使用curl
或任何非浏览器工具向服务器发送请求,并手动向请求添加Origin
标头。但没关系——在这种情况下,他们会得到的响应和你发送到浏览器的响应是一样的。所以这实际上对测试很有帮助。
如果不允许原点,我应该返回什么?
根本不包括访问控制允许原点标头?
对对于这些情况,只需根本不发回访问控制允许源站
响应头即可。这就是缺少标头的语义:如果服务器不发送Access Control Allow Origin
response标头,这意味着服务器没有选择允许来自前端代码运行浏览器的跨源请求,因此默认的同源策略适用。
也就是说,通过不发送Access Control Allow Origin
响应头,服务器告诉浏览器:“请像往常一样使用默认的同源策略,并禁止发送此请求的源站的所有前端JavaScript代码访问此响应。”
或setHeader(“访问控制允许原点)”,
不,永远不需要像那样发回空值。这并不意味着什么特别的。
或setHeader(“访问控制允许原点”、“空”)?
绝对不要那样做。在许多情况下,浏览器会发送一个值为null
的Origin
头,除非您有意允许所有带有Origin:null
的请求访问服务器的响应,否则不要这样做。
有关详细信息,请参阅When浏览器必须在内部将origin设置为一个值,该值将被序列化为null
答案的一部分。在POST请求中,Firefox何时将origin头设置为null?
我正在使用的移动应用程序开发中工作。目前我正在使用处理移动应用程序,并且工作正常。(Android和iOS) 我需要在浏览器中使用与相同的应用程序。(使用 HTML5)。但是当我尝试在网站上运行我的应用程序时,我收到此错误: 当搜索专家说使用JSONP时。但是使用相同的XMLRPC方法我可以工作吗? 比如说; 对于登录目的我使用; 它作为一个移动应用程序运行良好。 但当我尝试作为网站运行时,出现<
我在后端使用spring boot服务,在前端使用angular 6。 在spring boot中,我使用启用了cors。 并且我正在为每个服务使用拦截器。 在前端呼叫服务中: 如果使用拦截器,我会得到以下异常。如果不使用隔膜,我不会得到cors错误。 加载失败http://localhost:7070/example/myservice:飞行前响应中的访问控制允许标头不允许请求标头字段访问控制允
我犯了这个错误 无法加载XMLHttpRequesthttp://domain.com/canvas/include/rs-plugin/js/extensions/revolution.extension.video.min.js.飞行前响应中的访问控制允许标头不允许请求标头字段X-Requested-With。 我的php页面顶部有这两行代码,用于加载这个js文件。 但是问题依然存在,我该怎么
问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您
我试着把数据从React.jslocalhostinsert.php文件。当我提交的形式从reactjs它给我错误的控制台错误是: 访问位于“”的XMLHttpRequesthttp://localhost/reactphpdemo/connect.php“起源”http://localhost:3000'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access
我试图加载一个测试网页(在我的服务器)。页面是: 但是webView没有加载页面。甚至在@-50之后也没有呼叫 此外,从url加载js脚本的所有站点都会出现此问题。包括youtube、fb等。 这里我的设置 布局: