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

由于CORS,HTTP响应中缺少标头,cors,jetty,embedded-jetty,Cors,Jetty,Embedded Jetty,我正在通过maven使用嵌入式jetty,版本为9.4.19.v20190610 我使用CORS过滤器,如下所示: FilterHolder holder=newfilterholder(CrossOriginFilter.class); holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,“*”); holder.setInitParameter(CrossOriginFilter.ACCESS\u CONTROL\u

我正在通过maven使用
嵌入式jetty
,版本为
9.4.19.v20190610

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

FilterHolder holder=newfilterholder(CrossOriginFilter.class);
holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,“*”);

holder.setInitParameter(CrossOriginFilter.ACCESS\u CONTROL\u ALLOW\u ORIGIN\u HEADER,“*”); setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,“GET、POST、HEAD、PUT、DELETE、OPTIONS”);
holder.setInitParameter(CrossOriginFilter.ACCESS\u CONTROL\u ALLOW\u METHODS\u HEADER,“*”);
holder.setInitParameter(CrossOriginFilter.ACCESS\u CONTROL\u ALLOW\u HEADERS\u HEADER,“true”); holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, “访问控制请求方法,x-csrftoken,ClientKey,如果不匹配,则访问控制请求标题,授权,x-Requested-With,首选,内容类型,x-Auth-Token,接受,来源,x-Requested-With,Pragma,refere,Referer,User Agent,主机,连接,缓存控制,接受语言,接受编码,内容长度,秒获取模式,秒获取站点”); 持有人名称(“交叉来源”); staticServletHandler.addFilter(holder,“/*”,EnumSet.of(DispatcherType.REQUEST));
我能够从任何服务器查询jetty托管的
REST
端点,而不会出现
CORS
错误。我使用以下
JS
(带
jquery
)代码访问端点(我在
chrome
中运行代码):

$.ajax({
类型:'Get',
cache:false,
数据类型:“json”,
url:myurl,
成功:((数据、文本状态、请求)=>{
this.etag=request.getResponseHeader('E-Tag');//如果在另一台服务器上执行JS,则为null
}),
});
如果我将
JS
代码托管在
jetty
上,我还可以访问E-Tag,如果我将代码托管在另一台服务器上,我将获取数据,但不获取E-Tag。因此,如果JS代码与端点位于同一台服务器上,我将获取响应头。如果它位于不同的服务器上,则会删除标头。因此,我猜这是一个CORS错误(我没有得到错误)如何配置jetty,使其可用于远程请求?

附加信息:我在jetty上创建电子标签标题,如下所示:

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
屏幕截图所示


对于来自另一台服务器的访问头的请求,
访问控制暴露头需要与响应一起发送。标头的值应该是以逗号分隔的要公开的标头名称列表

示例:
访问控制公开标题:内容长度,X-Kuma-Revision

有关更多信息和清晰度,请参阅

实现:添加以下init参数:

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

令人困惑的问题。你的问题表明它对Jetty有效,然后你问如何使它对Jetty有效??我可以提出请求,但我没有得到标题如果JS托管在另一台服务器上。为了你的反馈,我试图澄清我的问题。根据你的编辑,实现不正确。您需要添加参数“EXPOSED_HEADERS_PARAM”,类似于“ALLOWED_HEADERS_PARAM”。请参阅我编辑的answerCrossOriginFilter.ACCESS\u CONTROL\u EXPOSE\u HEADERS\u HEADER是一个常量,其值为“ACCESS CONTROL EXPOSE HEADERS”-->因此我的实现似乎与您的相同。。。或者我要监督什么?请添加以下行:
holder.setInitParameter(CrossOriginFilter.EXPOSED_HEADERS_PARAM,“内容长度,X-Kuma-Revision,E-Tag”)非CrossOriginFilter.ACCESS\u CONTROL\u EXPOSE\u HEADER\u HEADER