Rest chrome中缺少Http响应头,但在Postman中会显示它们
在Angular中调用我的REST服务时,没有响应头 角度登录方式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,状态文本:“
登录(用户名:字符串,密码:字符串){
常量凭据={“用户名”:用户名,“密码”:密码};
返回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
访问控制公开标题:授权,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.IAppBuilderHttpResponse对象中的头是延迟加载的,因此在您强制加载值之前,
头将显示为空。尝试调用response.headers.keys()
以查看所有可用的头名称。顺便说一下,这还强制将所有值加载到mapresponse.headers.headers
确保使用headers.get('my-header-name')
如果您只需要访问一个特定的头值。data是resposne对象,您应该执行console.log(data.headers)来查看它们,或者JSON。如果您看不到,请在日志中对其进行字符串化。@SrAxi否。@Tim您的服务器没有向授权发送设置,因此js无法使用该设置。@SrAxi如果不允许,将根本没有响应。@n00dl3您不会得到“拒绝访问”响应吗?然而,你是对的。@Tim:cors.exposedHeadersAuthorization