Http Headers详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http Headers详解相关的知识,希望对你有一定的参考价值。

参考技术A

所以,一个完整的请求头/响应头,应该除了自身,还包括 General Headers 和 Entity Headers 。

服务器发送的响应报文包含Set-Cookie首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。

流程图:

浏览器强制告诉服务器不缓存资源:

除了上面的基本的5中类型外,还有一种类型,即multipart类型。

下面是认证执行过程:

浏览器检测到WWW-Authenticate为basic后,自动弹出框。

如果验证不通过,则继续返回状态码401,提示验证失败。

缺点:

过程如下:

缺点:

而利用 SSL客户端认证则可以避免该情况的发生。在SSL认证时,必须使用https协议。
由于SSL中的各种加密和秘钥算法过于复杂,有兴趣的可以直接阅读SSL相关书籍,本文忽略详细过程。

认证过程:

然后浏览器成功登录,并跳转页面。

这样,服务端会认为是你本人在操作。

Set-cookie: phpSESSID=kq8v6iujarsgflkeq7shmai9c7, httponly

例如:

如果返回

Access-Control-Allow-Origin: http://foo.example

表示, http://bar.other的资源只能被http ://foo.example访问,其他网站不能访问我。

那么此请求是个“非简单请求”。首先浏览器会自动发送带有options选项的预检请求,然后发送实际请求

AngularJS中的$ http Auth Headers

我有一个角度应用程序正在命中节点API。我们的后端开发人员已经在API上实现了基本身份验证,我需要在请求中发送auth标头。

我跟踪了:

$http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' + password);

我试过了:

.config(['$http', function($http) {
       $http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' +    password);
}])

以及将其直接附加到请求:

$http({method: 'GET', url: url, headers: {'Authorization': 'Basic auth'}})})

但没有任何作用。怎么解决这个?

答案

你正在混合使用案例;实例化服务($http)不能在配置阶段使用,而提供程序不能在运行块中使用。来自module docs

  • 配置块 - [...]只有提供者和常量可以注入配置块。这是为了防止在完全配置服务之前意外实例化服务。
  • 运行块 - [...]只有实例和常量可以注入运行块。这是为了防止在应用程序运行时进一步进行系统配置。

因此,请使用以下任一方法:

app.run(['$http', function($http) {
    $http.defaults.headers.common['Authorization'] = /* ... */;
}]);
app.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common['Authorization'] = /* ... */;
}])
另一答案

我有一个服务工厂,它有一个角度请求拦截器,如下所示:

var module =  angular.module('MyAuthServices', ['ngResource']);

module
    .factory('MyAuth', function () {
    return {
        accessTokenId: null
    };
})    
.config(function ($httpProvider) {
    $httpProvider.interceptors.push('MyAuthRequestInterceptor');
})

.factory('MyAuthRequestInterceptor', [ '$q', '$location', 'MyAuth',
    function ($q, $location, MyAuth) {
        return {
            'request': function (config) {


                if (sessionStorage.getItem('accessToken')) {

                    console.log("token["+window.localStorage.getItem('accessToken')+"], config.headers: ", config.headers);
                    config.headers.authorization = sessionStorage.getItem('accessToken');
                }
                return config || $q.when(config);
            }
            ,
            responseError: function(rejection) {

                console.log("Found responseError: ", rejection);
                if (rejection.status == 401) {

                    console.log("Access denied (error 401), please login again");
                    //$location.nextAfterLogin = $location.path();
                    $location.path('/init/login');
                }
                return $q.reject(rejection);
            }
        }
    }]);

然后在我的登录控制器中登录时,我使用以下行存储了accesstoken:

sessionStorage.setItem('currentUserId', $scope.loginResult.user.id);
sessionStorage.setItem('accessToken', $scope.loginResult.id);
sessionStorage.setItem('user', JSON.stringify($scope.loginResult.user));
sessionStorage.setItem('userRoles', JSON.stringify($scope.loginResult.roles));

这样我可以在登录后的每个请求上为请求分配标题。这就是我这样做的方式,完全是批评,但它看起来效果很好。

另一答案

您可以在控制器中使用它:

.controller('Controller Name', ['$http', function($http) {
   $http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' + password;
}]);
另一答案

angularjs documentation中,您可以看到一些设置标题的方法,但我认为这就是您要搜索的内容:

$http({
    method: 'POST',
    url: '/theUrl',
    headers: {
        'Authorization': 'Bearer ' + 'token'
         //or
         //'Authorization': 'Basic ' + 'token'
    },
    data: someData
}).then(function successCallback(response) {
    $log.log("OK")
}, function errorCallback(response) {
    if(response.status = 401){ // If you have set 401
        $log.log("ohohoh")
    }
});

我在我的angularjs客户端使用这个结构与ASP.NET 5服务器,它的工作原理。

另一答案

$http doc中,您可以看到应该使用$ httpProvider设置默认标头:

.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common['Authorization'] = 'Basic auth';
}]);
另一答案

工作示例:我从@MrZime学到了这一点 - 谢谢!并阅读https://docs.angularjs.org/api/ng/service/ $ http#setting-http-headers

最新的NGULARJS v1.6.x截至2018年3月2日

        var req = {
            method: 'POST',
            url: 'https://api.losant.com/applications/43fdsf5dfa5fcfe832ree/data/last-value-query',
            headers: {
                'Authorization': 'Bearer ' + 'adsadsdsdYXBpVG9rZW4iLCJzrdfiaWF0IjoxNdfsereOiJZ2V0c3RfdLmlvInfdfeweweFQI-dfdffwewdf34ee0',
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            data: {
                "deviceIds": [
                    "a6fdgdfd5dfqaadsdd5",
                    "azcxd7d0ghghghghd832"
                ],
                "attribute": "humidity"
            }
        }




        $http(req).then(function successCallback(response) {

            $log.log("OK!")
             returnedData = response.data

        }, function errorCallback(response) {

            if (response.status = 401) { // If you have set 401

                $log.log("BAD 401")

            }
            else {

                $log.log("broken at last")

            }
        });

将它添加到your.js文件中并将此your.js包含在your.html文件中,并在chrome / F12上查看控制台面板上的chrome,你应该得到OK状态,“returnData”最终是你想要的。享受数据!

另一答案

在将其附加到“Basic”之前,请尝试使用base64编码您的用户:密码,如下所示:

headers: {
  'Authorization': "Basic " + auth64EncodedUserColonPass
}

以上是关于Http Headers详解的主要内容,如果未能解决你的问题,请参考以下文章

详解Provisional headers are shown(补充)

HTTP Headers解析

aiohttp 异步http请求-11.ClientResponse 获取响应headers 和cookies

带有 PECL_HTTP 的 http_parse_headers

获取 Mailgun 'ERR_HTTP_HEADERS_SENT'

AngularJS中的$ http Auth Headers