5.9K Star 11.7K Fork 4K

GVPdotNET China / Furion

 / 详情

关于跨域获取不到Headers值的问题

已完成
创建于  
2022-06-10 10:54

Furion:v3.5.0

之前一直用的Blazor-Server进行开发和使用,这种方式不涉及跨域。
HttpClient类的 Response.Content.Headers 里面是能够获取到access-token, x-access-token的。
因为了同套代码支持Blazor-Wasm模式,使用中发现:
这里面断点:HttpClient类的 Response.Content.Headers 只能够获取到:content-type。
然后又用jquery版本写了个简单的前端调用, 仍旧不行。
服务端用了原始的AspnetCore和Furion,和NodeJs Express来做。。 是不是就是规定就不允许访问?
CorsAccessorSettings的WithHeaders也试过。

我的述求就是能够访问到Headers里面的access-token, x-access-token

Furion后台代码 - API独立后台,前后分离,与Blazor不集成:

services.AddCorsAccessor();
app.UseCorsAccessor(); //开启跨域,允许所有
//按照大佬增加所有允许
app.Use(async (context, next) =>
    {
        context.Response.Headers["Access-Control-Allow-Headers"] = "*, access-token, x-access-token";
        context.Response.Headers["Access-Control-Allow-Methods"] = "*";
        context.Response.Headers["Access-Control-Allow-Origin"] = "*";
        await next.Invoke();
    });

//Service里面
public void Login([FromBody] LoginInDto loginDto)
{
    var _httpContextAccessor = App.GetService<IHttpContextAccessor>();
    _httpContextAccessor.HttpContext.Response.Headers["access-token"] = "123"; //accessToken;
    _httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = "456";//refreshToken;    
}

前端代码:http://localhost:3000/index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <script>       
        function loadXMLDoc() {
            var settings = {
                "url": "http://localhost:5015/login",               
                "method": "POST",
                "timeout": 0,
                "headers": {
                    "Content-Type": "application/json"
                },
                "data": JSON.stringify({
                    "Password": "1",
                    "Account": "1"
                }),
            };

            $.ajax(settings).done(function (data,status,xhr) {
                var headers = xhr.getAllResponseHeaders();
                var arr = headers.trim().split(/[\r\n]+/);
                var headerMap = {};
                arr.forEach(function (line) {
                    var parts = line.split(': ');
                    var header = parts.shift();
                    var value = parts.join(': ');
                    headerMap[header] = value;
                });
                //打印内容:application/json; charset=utf-8。  
                //但是我想把 access-token都能获取到。
                console.info(headerMap); 
            });
        }
    </script>
</head>

<body>    
    <button type="button" onclick="loadXMLDoc()">获取响应Headers</button>
</body>
</html>

浏览器请求截图:
1.OPTIONS 204:
输入图片说明
2.POST 200:
输入图片说明

评论 (4)

Gordo 创建了任务
Gordo 修改了描述
Gordo 修改了描述
Gordo 修改了描述
Gordo 修改了描述
Gordo 修改了描述
Gordo 修改了描述
Gordo 修改了描述
Gordo 修改了描述
展开全部操作日志

appsettings.json 里面配置这个看看:

{
  "CorsAccessorSettings": {
    "WithExposedHeaders": ["access-token","x-access-token"]
  }
}

经过测试(使用 Furionsamples 作为测试:

前端代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  </head>
  <body>
    <script type="text/javascript">
      function loadXMLDoc() {
        var settings = {
          url: "https://localhost:44316/api/person/all",
          method: "GET",
          headers: {
            "Content-Type": "application/json",
          },
        };

        $.ajax(settings).done(function (data, status, xhr) {
          console.log(xhr);
          console.log(xhr.getAllResponseHeaders());
          console.log(xhr.getResponseHeader("environment"));
        });
      }

      loadXMLDoc();
    </script>
  </body>
</html>

后端跨域配置

{
  "CorsAccessorSettings": {
    "WithExposedHeaders": ["access-token","x-access-token", "environment"]
  }
}

注入,jquery 的 ajax 本身不能获取常规以外的头,如果你需要获取指定的头,就必须配置 WithExposeHeaders 的名称

测试结果

输入图片说明

百小僧 任务状态待办的 修改为已完成

文档早已更新:输入图片说明

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
974299 monksoul 1578937227 81568 gordo 1578916720
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助