Rest chrome中缺少Http响应头,但在Postman中会显示它们

Rest chrome中缺少Http响应头,但在Postman中会显示它们,rest,angular,Rest,Angular,在Angular中调用我的REST服务时,没有响应头 角度登录方式 登录(用户名:字符串,密码:字符串){ 常量凭据={“用户名”:用户名,“密码”:密码}; 返回this.http.post(this.url,凭证) .订阅( data=>console.log(data),//JSON.stringify(data.headers)也为空 error=>console.log(错误) ); } Chrome开发工具控制台中的输出 响应{正文:“”,状态:200,确定:true,状态文本:“

在Angular中调用我的REST服务时,没有响应头

角度登录方式

登录(用户名:字符串,密码:字符串){
常量凭据={“用户名”:用户名,“密码”:密码};
返回this.http.post(this.url,凭证)
.订阅(
data=>console.log(data),//JSON.stringify(data.headers)也为空
error=>console.log(错误)
);
}
Chrome开发工具控制台中的输出

响应{正文:“”,状态:200,确定:true,状态文本:“确定”,标题: Headers…}Headers:Headers\u Headers:Map(0)\u normalizedNames: 映射(0)proto:Objectok:truestatus:200statusText:“OK”类型:2url: 正文:“proto:正文

但当我与邮递员发送相同的post请求时,我得到了预期的结果:

Access-Control-Allow-Credentials →true
Access-Control-Allow-Origin →chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
Authorization →Bearer eyJ[...]
Connection →keep-alive
Content-Length →0
Date →Mon, 12 Jun 2017 13:19:54 GMT
Server →WildFly/10
Vary →Origin
X-Powered-By →Undertow/1
其余服务

@POST
@使用(MediaType.APPLICATION_JSON)
公共响应认证者(CredentialsDTO-CredentialsDTO){
试一试{
authService.login(credentialsDTO.getUsername(),credentialsDTO.getPassword());
}捕获(错误凭证异常e){
返回Response.status(status.FORBIDDEN).entity(“ErrorCredentialsException”).build();
} 
//发行代币
字符串标记=issueToken(credentialsDTO.getUsername());
//返回响应上的令牌
返回Response.ok().header(授权,“承载者”+令牌).build();
}
为什么我不能在chrome中看到标题?

更新 我还使用了一个CORSFilter,它允许Javascript首先联系我的后端。这是my web.xml中的配置方式


科尔斯
com.thetransactioncompany.cors.CORSFilter
cors.allowgenerichtt前传
真的
金鸡儿
*
cors.allowSubdomains
假的
cors.supportedMethods
获取、标题、发布、删除、选项
cors.supportedHeaders
*
cors.supportsCredentials
真的
科斯马克萨奇酒店
3600
科尔斯
*

虽然我认为它已配置为允许所有内容,但我不确定这是否与我的问题有关。

默认情况下,CORS响应仅公开以下6个标题:

  • 缓存控制
  • 内容语言
  • 内容类型
  • 过期
  • 上次修改的
  • Pragma
要允许脚本访问服务器发送的其他头,服务器需要发送头

Access Control Expose Headers响应标头通过列出其名称指示哪些标头可以作为响应的一部分公开

例如:
访问控制公开标题:授权,X-Foobar

您可以调整
web.xml
文件,包括此文件,以允许从生成XHR的脚本访问
授权
头:


cors.exposedHeaders
授权人‌​在…上

我使用以下解决方案允许在Owin自托管web api中使用自定义头

using Owin;
using Microsoft.Owin.Cors;
using System.Threading.Tasks;
using System.Web.Cors;

namespace App.Web.App_Start
{
    public static class CorsConfig
    {
        public static void Configure(IAppBuilder app)
        {
            var allowedOrigins = "comma,separated,list,of,origins";
            var corsPolicy = new CorsPolicy
            {
                AllowAnyHeader = true,
                AllowAnyMethod = true,
                AllowAnyOrigin = false,
                SupportsCredentials = true
            };

            corsPolicy.ExposedHeaders.Add("Custom-Header");

            foreach (string origin in allowedOrigins.Split(','))
                corsPolicy.Origins.Add(origin);

            app.UseCors(new CorsOptions
            {
                PolicyProvider = new CorsPolicyProvider
                {
                    PolicyResolver = context => Task.FromResult(corsPolicy)
                }
            });
        }

    }

}

我这样调用方法CorsConfig.Configure(app);//app是Owin.IAppBuilder

HttpResponse对象中的头是延迟加载的,因此在您强制加载值之前,
头将显示为空。尝试调用
response.headers.keys()
以查看所有可用的头名称。顺便说一下,这还强制将所有值加载到map
response.headers.headers


确保使用
headers.get('my-header-name')
如果您只需要访问一个特定的头值。

data是resposne对象,您应该执行console.log(data.headers)来查看它们,或者JSON。如果您看不到,请在日志中对其进行字符串化。@SrAxi否。@Tim您的服务器没有向
授权发送设置,因此js无法使用该设置。@SrAxi如果不允许,将根本没有响应。@n00dl3您不会得到“拒绝访问”响应吗?然而,你是对的。@Tim:
cors.exposedHeadersAuthorization