由于CORS,HTTP响应中缺少标题

时间:2019-12-02 10:04:11

标签: cors jetty embedded-jetty

我正在通过embedded jetty版本的maven使用<jetty.version>9.4.19.v20190610</jetty.version>

我使用CORS过滤器,如下所示:

        FilterHolder holder = new FilterHolder(CrossOriginFilter.class);
        holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
        holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
        holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD,PUT,DELETE,OPTIONS");
        holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_METHODS_HEADER, "*");
        holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_HEADERS_HEADER, "true");
        holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,
                "Access-Control-Request-Method,x-csrftoken,ClientKey,If-None-Match,Access-Control-Request-Headers,Authorization,X-Requested-With,Prefer,Content-Type,X-Auth-Token,Accept,Origin,X-Requested-With,Pragma,Refer,Referer,User-Agent,Host,Connection,Cache-Control,Accept-Language,Accept-Encoding,Content-Length,sec-fetch-mode,sec-fetch-site");
        holder.setName("cross-origin");


        staticServletHandler.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));

我能够从任何服务器查询Jetty托管的REST端点,而不会出现CORS错误。我正在使用以下JS(带有jquery)代码来访问端点(我正在chrome中运行代码):

$.ajax({
          type:'Get',
          cache: false,
          dataType: 'json',
          url: myurl,
          success:((data,textstatus,request)=>{
            this.etag=request.getResponseHeader('E-Tag'); //null if JS is executed on another server
          }),
      });

如果我将JS代码托管在jetty上,那么我还可以访问E标签,如果我将代码托管在另一台服务器上,我将获取数据,但不能获取E -TAG。因此,如果JS代码与端点位于同一服务器上,那么我将获得响应头。如果它位于其他服务器上,则标头将被删除。因此,我想这是一个CORS错误(我没有收到错误)。 我如何配置它可用于远程请求的码头?

其他信息:我在码头上创建电子标签标头,如下所示:

return Response.status(200).entity(status).header("E-Tag","abc").build();

编辑: 我添加了以下行:

holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_EXPOSE_HEADERS_HEADER, "Content-Length, X-Kuma-Revision, E-Tag");

,但仍缺少E-Tag标头。服务器肯定将标头添加到响应中,如以下Postman的屏幕截图所示。

enter image description here

1 个答案:

答案 0 :(得分:1)

要使来自另一台服务器的请求访问标头,需要将Access-Control-Expose-Headers标头与响应一起发送。标头的值应为您要公开的标头名称的逗号分隔列表。

示例:Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision

有关更多信息和清晰度,请参考Mozilla Developer link

实现:添加以下初始化参数:

holder.setInitParameter(CrossOriginFilter.EXPOSED_HEADERS_PARAM, "Content-Length, X-Kuma-Revision, E-Tag");