由于 CORS,HTTP 响应中缺少 Header
Missing Header in HTTP Response due to CORS
我正在通过版本为 <jetty.version>9.4.19.v20190610</jetty.version>
的 Maven 使用 embedded jetty
我使用 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
}),
});
如果我在 jetty
上托管 JS
代码,我还可以访问 E-Tag,如果我在另一台服务器上托管代码,我 GET数据而不是 E-TAG. 因此,如果 JS 代码与端点位于同一服务器上,那么我会得到响应 header。如果它位于不同的服务器上,则 header 将被删除。因此,我猜这是一个 CORS 错误(我没有收到错误)。 我如何配置用于远程请求的码头?
附加信息:我在码头上创建 e-tag header 如下:
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 header 仍然不见了。服务器肯定会将 header 添加到响应中,如下面 Postman
的屏幕截图所示。
对于来自另一台服务器的访问 headers 的请求,Access-Control-Expose-Headers
header 需要与响应一起发送。 header 的值应该是要公开的 header 名称的逗号分隔列表。
示例: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");
我正在通过版本为 <jetty.version>9.4.19.v20190610</jetty.version>
embedded jetty
我使用 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
}),
});
如果我在 jetty
上托管 JS
代码,我还可以访问 E-Tag,如果我在另一台服务器上托管代码,我 GET数据而不是 E-TAG. 因此,如果 JS 代码与端点位于同一服务器上,那么我会得到响应 header。如果它位于不同的服务器上,则 header 将被删除。因此,我猜这是一个 CORS 错误(我没有收到错误)。 我如何配置用于远程请求的码头?
附加信息:我在码头上创建 e-tag header 如下:
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 header 仍然不见了。服务器肯定会将 header 添加到响应中,如下面 Postman
的屏幕截图所示。
对于来自另一台服务器的访问 headers 的请求,Access-Control-Expose-Headers
header 需要与响应一起发送。 header 的值应该是要公开的 header 名称的逗号分隔列表。
示例: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");