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:自定义响应标头消失的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 使用 CORS 获取自定义响应标头

由 CORS 阻止的 Spring Boot 自定义响应标头

如何启用 CORS 的 Apache Web 服务器(包括预检和自定义标头)?

Safari 中的 CORS 错误,而不是 Chrome

自定义 HTTP 标头块 Jersey CORS 过滤器

BaseX REST API:设置自定义 HTTP 响应标头