CORS 来源允许参数维护

Posted

技术标签:

【中文标题】CORS 来源允许参数维护【英文标题】:CORS origin allowed parameters maintenance 【发布时间】:2017-04-27 02:21:14 【问题描述】:

我在我的 JEE 服务器上创建了一个 JAXRS REST API。因此,为了能够接收跨源请求,我添加了一个过滤器提供程序以接受 CORS 请求:

@Provider
public class CORSFilter implements ContainerResponseFilter


    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException
       
        responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        responseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        responseContext.getHeaders().add("Access-Control-Max-Age", "1209600");
    


我还创建了一个单页 Web 应用程序 (SPWA)(位于 localhost:3000),我试图从位于 localhost:8082 的 REST 端点获取信息。

因此,浏览器检测到我正在尝试获取跨来源的信息。所以它首先尝试OPTIONS 我要发送的请求(检查用户是否存在)。

这是浏览器尝试发送到我的服务器的 CORS 请求:

Host: localhost:8082
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: passwd,user
Origin: http://localhost:3000
Connection: keep-alive

正如您在 Filter Provider 上看到的,我允许使用这些标头:

responseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");

所以,问题是:

    我的 REST 端点会增长,每次添加带参数的方法时,我都必须检查和更新 "Access-Control-Allow-Headers" -> 我认为这是一项非常艰巨的任务。

    是否有某种方法可以信任某些来源并避免浏览器在每次发出请求时首先发送OPTIONS 请求。

希望我解释得这么好。

【问题讨论】:

【参考方案1】:

1.我的 REST 端点会增长,每次我添加一个带参数的方法时,我都必须检查和更新“Access-Control-Allow-Headers” -> 我认为这很难任务。

您必须仅包含您的服务器能够管理的允许标头 (没有那么多。这个list中大约30个是标准的)。通常,新的业务方法不需要新的标头,因为它们通常与有效负载一起使用。大多数标头由您正在使用的容器或 JAX-RS 管理。

    是否有某种方法可以信任某些来源并避免浏览器在每次发出请求时首先发送 OPTIONS 请求。

CORS 请求使用 OPTIONS 请求进行预检。见Preflighted requests at Mozilla Developer Network。在您的示例中,带有application/xmlPUT 请求也将被预检,即使它是在同一个来源中请求的

与简单的请求(上面讨论过)不同,“预检”请求首先通过 OPTIONS 方法向另一个域上的资源发送 HTTP 请求,以确定实际请求是否可以安全发送。 跨站点请求是这样预检的,因为它们可能会对用户数据产生影响。特别是,在以下情况下会预检请求:

它使用 GET、HEAD 或 POST 以外的方法。此外,如果 POST 用于发送 Content-Type 不是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 的请求数据,例如如果 POST 请求使用 application/xml 或 text/xml 将 XML 有效负载发送到服务器,则请求被预检。 它在请求中设置自定义标头(例如,请求使用诸如 X-PINGOTHER 之类的标头)

【讨论】:

以上是关于CORS 来源允许参数维护的主要内容,如果未能解决你的问题,请参考以下文章

允许任何 CORS 来源 (*) 时是不是应该设置“Vary: Origin”?

没有“访问控制允许来源”-CORS

CORS 缺少允许来源

Laravel 上的 CORS(访问控制允许来源)

CORS 允许来源限制不会导致服务器拒绝请求

即使我允许所有来源,为啥我会收到 CORS 错误?