CORS谁必须送什么?

CORS谁必须送什么?,cors,Cors,在什么情况下,我无法理解哪个组件必须发送哪些标头: 我有以下组件 浏览器:本地,显示网站 Webserver:remote,apache,在端口80为http网站提供服务 REST服务器:golang中的远程自定义实现,在端口8080处提供资源,并提供三种类型的ResSource /api/登录(POST) /api/foo(GET) /api/bar/0/sub/1(获取和发布) 只要我的整个CORS设置只与localhost一起工作,一切都很好。但是现在我尝试在remove服务器上执行,我得

在什么情况下,我无法理解哪个组件必须发送哪些标头:

我有以下组件

  • 浏览器:本地,显示网站

  • Webserver:remote,apache,在端口80为http网站提供服务

  • REST服务器:golang中的远程自定义实现,在端口8080处提供资源,并提供三种类型的ResSource

    /api/登录(POST)
    /api/foo(GET)
    /api/bar/0/sub/1(获取和发布)

  • 只要我的整个CORS设置只与localhost一起工作,一切都很好。但是现在我尝试在remove服务器上执行,我得到了CORS冲突

    大多数在线文档都讨论了浏览器和服务器应该做什么,但哪些服务器(网站和rest)必须做什么


    问题:谁必须设置哪个访问控制允许源站标题发布登录请求?

    以下从各种来源收集的笔记帮助了我作为CORS初学者(我现在仍然非常肯定是)-因此,也许它们也会帮助其他人

    此外,我相信下面的注释远远不是完整的故事。正如@amon所说,反向代理也是一种解决CORS问题的方法

    1) 那是CORS流程图 请参阅-显示的摘要描述了谁发送了什么。然而,作为一名初学者,我发现流程图最初很难单独理解

    我看了一下,它提供了更多关于谁可以发送哪些标题的技术细节。例如,三个场景中的第二个场景显示了谁为包含飞行前请求的请求发送内容:

    需要预照明的三个示例是:

    • 该请求包括身份验证令牌
    • 请求中包含自定义标头
    • 该请求是一个包含JSON或XML负载的ajax调用
    相反,包含纯
    GET
    s的请求不会被预引导

    这里的一个关键点是,管理从浏览器到服务器的这些交互的是浏览器,而不是客户端应用程序。客户端应用程序不直接参与这些交互

    在服务器上,它通常是一个CORS过滤器,用于控制从服务器返回到浏览器的响应内容(下面提供了一个示例)

    对于“谁发送了什么”的问题,你可能只需要这些就可以得到一个合理完整的答案。但我还是很困惑

    我看了一个例子,它帮助了我很多-见下文


    我认为,在这一过程中,我的最佳洞察是,我的客户端应用程序不需要做任何特定的事情来解决CORS限制。它是运行我的应用程序的浏览器,负责客户端CORS处理。正如@amon所说,CORS的目的不是保护资源,而是帮助浏览器保护用户免受恶意网站的攻击。


    2) 一个例子 看一个具体的例子有助于我理解谁发送了什么

    场景:我们在
    https://domainA.com
    。它向不相关的服务器发出API请求(
    http://anotherdomainX.net

    我在这里展示的示例服务器是Tomcat——其他服务器配置CORS过滤器的方式可能有很大不同(我不知道)。但Tomcat示例以相对清晰的方式列出了许多细节

    有关示例,请参见

    这是该示例中的XML:

    <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
        <init-param>
            <param-name>cors.allowed.origins</param-name>
            <param-value>
                http://domainA.com,
                https://domainA.com,
                http://localhost:4200
            </param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.methods</param-name>
            <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>
                Content-Type,
                X-Requested-With,
                Accept,
                Accept-Encoding,
                Accept-Language,
                Origin,
                Access-Control-Request-Method,
                Access-Control-Request-Headers,
                Connection,
                Host,
                authorization
            </param-value>
        </init-param>
        <init-param>
            <param-name>cors.exposed.headers</param-name>
            <param-value>
                Access-Control-Allow-Origin,
                Access-Control-Allow-Credentials
            </param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    
    这里的协议是
    文件:
    。有关此操作的注意事项和警告,请参阅

    6) 公共宣传短片 答案中包含问题的形式可能不好,但是

    公共可用服务如何处理COR?他们只是在他们的
    cors允许的来源中启用“所有人”吗

    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value> * </param-value>
    </init-param>
    
    
    科尔斯
    * 
    
    我想答案是。在其“”部分中,链接文章指出:

    CORS是一种在试图保持安全的同时放松的同源政策。使用*将禁用CORS的大多数安全规则。有些情况下,通配符是可以使用的,比如集成到许多第三方网站中的开放API



    如果合适的话,我很乐意编辑上面的注释以更正任何错误。

    新规范,我不知道详细信息,虽然我不是web开发人员,但由于去年源服务器应该提供正确的标题,旧方法不应该起作用(应该被浏览器阻止)。这就是为什么Chrome去年破坏了相当多的内容转发网站(讽刺的是,其中包括一些地区性的谷歌服务器)当你回忆起它不是为了保护资源,而是为了帮助浏览器保护用户免受恶意网站攻击时,CORS更容易理解。因此,您想要访问的资源(RESTAPI)必须设置CORS头以允许网站访问。但是,如果所有部分都在您的控制之下,我宁愿设置一个反向代理来为来自同一来源的网站+API提供服务。@amon好的,这很有帮助。你能把这个作为一个答案吗?@初学者我已经停止写答案了,但是如果有人把评论变成完整的答案,我当然欢迎。我不知道有多少来自应答者的流量,一个像sees-Through这样的二级标记。请阅读您收到的错误消息。它准确地告诉你,申请成功还缺少什么。我不知道你为什么被否决。你的帖子对我很有帮助。
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value> * </param-value>
    </init-param>