Safari 和 CORS:自定义响应标头消失
Posted
技术标签:
【中文标题】Safari 和 CORS:自定义响应标头消失【英文标题】:Safari and CORS: Custom Response Headers disappear 【发布时间】:2014-10-10 08:26:34 【问题描述】:我已经尽可能简单地重新创建了我的错误,它是这样的:
我有一个 c# Web Api 项目,并安装了 CORS Web Api nuget 包。然后我将它添加到 WebApiConfig.cs 的注册函数中:
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
然后我创建了一个非常简单的“GetToken”api,粘贴在下面:
[Route("~/api/auth/token")]
public HttpResponseMessage GetToken()
var result = new
FirstName = "matt"
;
var response = Request.CreateResponse(HttpStatusCode.OK, result);
HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Headers", "Authorization");
HttpContext.Current.Response.Headers.Set("Access-Control-Expose-Headers", "Authorization");
HttpContext.Current.Response.Headers.Set("Authorization", "test");
//HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Methods", "GET, OPTIONS");
//HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Credentials", "true");
//HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Origin", "http://run.plnkr.co/");
return response;
注释掉的代码只是我用来尝试解决此问题的许多 Header 配置组合中的一部分。在 web api 之后,我在 plunker 中创建了一个非常基本的 api 调用:
var Test1 = function()
$.ajax("http://localhost:61826/api/auth/token",
type: "GET",
success: function(data, status, xhr)
debugger;
,
error: function(err)
debugger;
,
crossDomain: true
);
我还创建了一个 Angular 版本,如果有人需要,我会分享。
最终结果。在 chrome 中,它工作得非常好,你可以在这里看到(授权标头在那里):
但在 Safari 中它不起作用,正如您在此处看到的(缺少授权标头):
这几天我一直在碰壁,现在是时候引入社区了。谁能告诉我这是怎么回事?
【问题讨论】:
你找到答案了吗? 【参考方案1】:嘿,而不是手动设置公开标头,您是否尝试过这样做
//set in the webapiconfig
config.EnableCors(new EnableCorsAttribute("*", "*", "*", "Authorization"));
[Route("~/api/auth/token")]
public HttpResponseMessage GetToken()
var result = new
FirstName = "matt"
;
var response = Request.CreateResponse(HttpStatusCode.OK, result);
response.Headers.Add("Authorization", "test");
return response;
【讨论】:
您好,开发人员,感谢您的回复。我刚刚尝试了您的建议,但没有运气。相同的行为(chrome 很好,safari 标题根本不出现)。 您是否查看了网络选项卡,您是否在响应标头中看到了它? 还有两件事要尝试 1) 尝试在 js 中执行 getResponseHeader("Authorization") 而不是全部获取 2) 如果响应正文为空,请尝试在响应正文中添加内容 3) 尝试绕过 jquery 并使用常规js 发出请求。我怀疑这是客户端问题 您好,开发人员,再次感谢您的快速回复。有趣的是,Safari 网络选项卡确实选择了 Authorization 标头。它只是没有被 ajax 成功函数消化。我试过只做 getResponseHeader("Authorization"),但没有运气。我在响应正文中添加了一些内容,然后就被采纳了。我现在正在绕过jquery。我会尽快发布结果。 嗨,开发者,我尝试绕过 jquery,但仍然没有运气。标题不出现。我用来绕过jquery的代码在这里:plnkr.co/edit/HVf8HvEunTbW2TVQRc9T?p=preview以上是关于Safari 和 CORS:自定义响应标头消失的主要内容,如果未能解决你的问题,请参考以下文章
由 CORS 阻止的 Spring Boot 自定义响应标头