我正在尝试读取angularjs中从服务器返回的此标头值,但是我没有看到此标头值存在。这是我的javascript控制台。
修改
return base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var response = task.Result;
if (response.RequestMessage.Headers.Contains(TOKEN_NAME))
{
string token = response.RequestMessage.Headers.GetValues(TOKEN_NAME).FirstOrDefault();
response.Headers.Add("Access-Control-Expose-Headers", TOKEN_NAME);
response.Headers.Add(TOKEN_NAME, token);
}
return response;
});
答案 0 :(得分:4)
访问/身份验证端点是否将令牌作为success方法中的数据返回,还是在服务器端代码中设置了令牌?
-Update -
如果您在HttpContext.Current.Response.AppendHeader('X-Token', "<some token value">);
中设置令牌,您应该可以在$ http承诺中抓取它
$http.get("<api endpoint>").then(function(data){
$log.log("data.config", data.config);
$log.log("data.headers()", data.headers());
$log.log("X-Token Header", data.headers()['x-token']);
});
data.config是发送到服务器的标头,例如accept和任何授权标头。
data.headers()
是返回设置为服务器端的所有标头的函数。
response.Headers.Add("Access-Control-Expose-Headers", TOKEN_NAME);
此行将确保此标头可供服务器使用
因此,如果我正确理解您在api请求的标头中传递x-token,并且Delegating Handler正在寻找TOKEN_NAME,然后重置它,然后您尝试在$ http的承诺中访问它。我只是为这个案例组成了一个测试,并且我正在取回x-token;
-Sample angular app
(function () {
var app = angular.module('app', []);
app.config(function ($httpProvider) {
$httpProvider.defaults.headers.common["x-token"] = "";
});
app.controller('home', function ($http, $log) {
$http.get('/api/car/get')
.then(function (response) {
$log.log("Response headers",response.headers());
$log.log(response.headers()["x-token"]);
});
});
})();
-CustomDelegatingHandler我不使用变量令牌,因为我没有令牌端点来获取它。相反,我只是传回了一个随机的GUID。
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
return await base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var response = task.Result;
//Are you sure your passing this check by setting the x-token common header in your angular $http requests?
if (response.RequestMessage.Headers.Contains(TOKEN_NAME))
{
string token = response.RequestMessage.Headers.GetValues(TOKEN_NAME).FirstOrDefault();
response.Headers.Add("Access-Control-Expose-Headers", TOKEN_NAME);
response.Headers.Add(TOKEN_NAME, Guid.NewGuid().ToString());
}
return response;
}, cancellationToken);
}