HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行,消息报头,空行(只有CRLF的行),消息正文组成。对于请求消息,开始行就是请求行;对于响应消息,开始行就是状态行。

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。报头域由名字+“:”+空格+值组成,消息报头域的名字与大小写无关。

1. 普通报头:

  在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。

  • Cache-Control:

  A.用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。

  B.请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached。

  C.响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。

  eg:为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:response.setHeader(“Cache-Control”,”no-cache”);或者response.setHeader(“Pragma”,”no-cache”); 两者作用相当。这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache。

  • Date:

  普通报头域表示消息产生的日期和时间

  • Connection:

  普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接

2.请求报头

  请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

  • Accept:

  用于指定客户端接受哪些类型的信息。如Accept:image/gif,表明客户端希望接受GIF图像格式的资源;text/html,表明客户端希望接受html文本。

  • Accept-Charset:

  用于指定客户端接受的字符集。如Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

  • Accept-Encoding:

  类似于Accept,用于指定可接受的内容编码。如Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可以接受。

  • Accept-Language:

  类似于Accept,用于指定一种自然语言。如Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

  • Authorization:

  用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

  • Host:

  发送请求时,该报头域是必需的,用于指定被请求资源的Internet主机和端口号,通常从HTTP URL中提取出来,如在浏览器中输入http://www.guet.edu.cn/index.html,浏览器发送的请求消息中,就会包含Host请求报头域,Host:www.guet.edu.cn。此处使用缺省端口号80,若指定了端口号,则为Host:www.guet.edu.cn:指定端口号

  • User-Agent:

  User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息。

3.响应报头

  响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。

  • Location:

  用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

  • Server:

  包含了服务器用来处理请求的软件信息,如服务器名字。与User-Agent请求报头域是相对应的。Servlet一般不设置这个值,而是由Web服务器自己设置。如Server:Apache-Coyote/1.1。

  • WWW-Authenticate:

  客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。

  例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。

4.实体报头

  请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(如有无实体正文)和请求所标识的资源的元信息。

  • Content-Encoding:

  文档的编码(Encode)方法。它的值指示了已经被应用到实体正文的附加内容的编码,只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。如Content-Encoding:gzip。

  Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

  • Content-Language:

  描述了资源所用的自然语言。没有设置该域,则认为实体内容将提供给所有的语言阅读者。eg:Content-Language:da。

  • Content-Length:

  用于指明实体正文的长度,以字节方式存储的十进制数字来表示。

  • Content-Type:

  用于指明发送给接收者的实体正文的媒体类型。eg:Content-Type:text/html;charset=ISO-8859-1;Content-Type:text/html;charset=GB2312。

  • Last-Modified:

  用于指示资源的最后修改日期和时间。

  • Expires:

  给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中的页面(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)。使用Expires指定页面过期时间。如Expires:Thu,15 Sep 2006 16:23:12 GMT。

  HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。为了让浏览器不要缓存页面,也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader(“Expires”, ”0″);

(四)HTTP消息报头的更多相关文章

  1. Http协议消息报头

    哎.不知道怎么写Http协议... 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. HTTP基于TCP/IP通信协议来传递数据 ...

  2. 原生socket请求url获取状态码、消息报头、响应正文

    需求: (1)使用socket及ssl模块写通用的web客户端 (2)向服务器发起请求 (3)接受响应内容并解析出状态码.消息报头.响应正文 (4)最核心的函数: 输入一个url,返回状态码.消息报头 ...

  3. XMPPFrameWork IOS 开发(四)消息和好友上下线

    原始地址:XMPPFrameWork IOS 开发(四) 消息 //收到消息 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XM ...

  4. 《HTTP协议详解》读书笔记---请求篇之消息报头

    不管是请求消息还是响应消息都包含消息报头,那么消息报头包含哪些内容?他们都代表什么含义呢?以下将带着 这些问题去学习消息报头. http消息(不管是请求消息还是响应消息)都是由开始行,消息报头(可选) ...

  5. HTTP协议详解之消息报头

    原文地址:http://www.cnblogs.com/devinzhang/archive/2012/02/06/2340186.html HTTP消息由客户端到服务器的请求和服务器到客户端的响应组 ...

  6. ActiveMQ学习系列(四)----消息持久化到mysql

    前记:目前学习还比较杂乱,还未找到系统化地学习ActiveMq的方法.在网上看到消息持久化的demo,了解了一下,在此记录. 一.目前ActiveMq支持的持久化方法 url:http://activ ...

  7. Delphi 7中的四种消息框

    Delphi中平常使用的消息框有四种形式,有ShowMessage.MessageDlg.Application.MessageBox.MessageBox.下面来深入了解下这四种形式的实现和使用.1 ...

  8. SpringBoot笔记十四:消息队列

    目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...

  9. android 进程/线程管理(四)----消息机制的思考(自定义消息机制)

    关于android消息机制 已经写了3篇文章了,想要结束这个系列,总觉得少了点什么? 于是我就在想,android为什么要这个设计消息机制,使用消息机制是现在操作系统基本都会有的特点. 可是andro ...

随机推荐

  1. 概率派VS贝叶斯派

    机器学习中的MLE和MAP两大学派的争论: 频率学派 - Frequentist - Maximum Likelihood Estimation (MLE,最大似然估计): 频率学派认为世界是确定的, ...

  2. Mindmaster破解版与正版

    1 免费版与正版 MindMaster思维导图软件,免费版没有过期时间可以一直使用,导出或者保存的文件没有水印.免费版和专业版的不同之处在于,专业版可以享受全功能,比如导出为可编辑的PDF.Offic ...

  3. Pock 把 Touch Bar 变成系统中的 Dock 栏

    Pock 把 Touch Bar 变成系统中的 Dock 栏 Pock 是一款 macOS App,你可以通过它把 Touch Bar 变成系统中的 Dock 栏,直接用来切换和启动 App,尽享全屏 ...

  4. TP5上传图片到七牛云,并且删除七牛云的图片

    一,通过composer 下载七牛云 sdk composer require qiniu/php-sdk 二,手动下载七牛云sdk 1,https://developer.qiniu.com/kod ...

  5. Spring Boot 系列:最新版优雅停机详解

    爱生活,爱编码,本文已收录架构技术专栏关注这个喜欢分享的地方. 开源项目: 分布式监控(Gitee GVP最有价值开源项目 ):https://gitee.com/sanjiankethree/cub ...

  6. BUUCTF-数据包中的线索 1

    打开题目里面一个pcapng的文件,于是我们拖进wireshark流量分析一波 发现有http的流量,于是我们过滤http 让后追踪http,然后发现base64的编码, 于是我们看到了base64编 ...

  7. pytest文档41-参数化 ids 用例描述为中文时控制台输出unicode编码问题(pytest_collection_modifyitems)

    前言 使用 pytest.mark.parametrize 参数化的时候,加 ids 参数用例描述有中文时,在控制台输出会显示unicode编码,中文不能正常显示. 使用 pytest_collect ...

  8. nginx安全:修改对外的服务软件名称并隐藏版本号(nginx1.18.0)

    一,为什么要隐藏nginx真实的软件名称? 1,nginx响应的Server头部都会携带上服务软件的名字和版本信息, 服务器软件的版本信息暴光在外部,很容易被黑客了解到,就通过相应版本的漏洞来攻击服务 ...

  9. svn:E170001:Authorization failed解决

    eclipse添加svn资源库:打开eclipse→Window→SVN资源库→空白处右键新建资源库位置→填写正确的URL→finish 错误信息: 原因一:用户名或密码错误 因svn登录验证的账号信 ...

  10. 为什么堆化 heapify() 只用 O(n) 就做到了?

    heapify() 前面两篇文章介绍了什么是堆以及堆的两个基本操作,但其实呢,堆还有一个大名鼎鼎的非常重要的操作,就是 heapify() 了,它是一个很神奇的操作, 可以用 O(n) 的时间把一个乱 ...