CORS来源允许参数维护

时间:2016-12-12 08:50:31

标签: rest java-ee cors jax-rs

我在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端点获取信息。< / p>

因此,浏览器正在检测我试图获取跨越起源的信息。因此,它尝试首先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");

所以,问题是:

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

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

  3. 我希望我能解释得那么好。

1 个答案:

答案 0 :(得分:2)

  

1.我的REST端点将会增长,每次我添加一个带参数的方法时,我都必须检查并更新&#34; Access-Control-Allow-Headers&#34; - &GT;我认为这是一项非常艰巨的任务。

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

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

使用OPTIONS请求预检CORS请求。见Preflighted requests at Mozilla Developer Network。在您的示例中,PUT application/xml请求也会被预检,即使是在相同的原始请求中

  

与简单请求(如上所述)不同,&#34;预先发布&#34;请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。 跨网站请求会像这样预检,因为它们可能会影响用户数据。特别是,如果出现以下情况,请求会被预检:

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