当前位置: 首页 > 知识库问答 >
问题:

我是否应该在选项请求之后的实际请求中向不允许的源发送任何访问控制允许源标题?

顾乐家
2023-03-14

我对它是如何工作的有一个大致的想法。如果请求的源头有效(允许),则返回相同的ORIGIN值

但我不知道:

  1. 对于OPTIONS请求之后的实际请求,我是否需要包括与我返回给客户端的预飞行请求完全相同的访问控制允许源标头?服务器代码应该只在实际请求中存在“ORIGIN”标头时才需要这样做吗?(在下面的代码中,我没有检查请求是OPTIONS/起飞前请求还是实际请求,我假设相同的代码可以适用于两者而没有伤害)。

(更多详细信息,因为“当请求的凭据模式为“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",

共有1个答案

满言
2023-03-14

对于OPTIONS请求之后的实际请求,是否需要包含与我为飞行前请求返回给客户端的完全相同的Access Control Allow Origin头?

是的,也就是说,如果您发回的是实际的原点值而不是“*”通配符,并且该原点值是导致选项请求成功的原因。因为如果发回的非通配符原点值与选项成功返回的值不同,则会导致浏览器阻止客户端代码访问响应(因为实际原点不匹配)。

服务器代码是否只需要在实际请求中存在“ORIGIN”头时执行此操作?

是的,因为当浏览器中运行的前端JavaScript代码使用XHR或从某个JavaScript库获取API或Ajax方法来发出跨源请求时,浏览器总是向请求添加origin头。而访问控制允许源代码仅由浏览器使用。

因此,向没有在请求中发送Origin的非浏览器工具发送回Access-Control-允许-Origin是没有意义的-在这种情况下,您发送的只是浪费字节。

当然,有些人可以使用curl或任何非浏览器工具向服务器发送请求,并手动向请求添加Origin标头。但没关系——在这种情况下,他们会得到的响应和你发送到浏览器的响应是一样的。所以这实际上对测试很有帮助。

如果不允许原点,我应该返回什么?
根本不包括访问控制允许原点标头?

对对于这些情况,只需根本不发回访问控制允许源站响应头即可。这就是缺少标头的语义:如果服务器不发送Access Control Allow Originresponse标头,这意味着服务器没有选择允许来自前端代码运行浏览器的跨源请求,因此默认的同源策略适用。

也就是说,通过不发送Access Control Allow Origin响应头,服务器告诉浏览器:“请像往常一样使用默认的同源策略,并禁止发送此请求的源站的所有前端JavaScript代码访问此响应。”

setHeader(“访问控制允许原点)”,

不,永远不需要像那样发回空值。这并不意味着什么特别的。

或setHeader(“访问控制允许原点”、“空”)?

绝对不要那样做。在许多情况下,浏览器会发送一个值为nullOrigin头,除非您有意允许所有带有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等。 这里我的设置 布局: