• 常用的 HTTP 请求头


     

    请求报文

    HTTP 请求整体的报文结构由 请求行-请求头-请求数据 三部分构成,其中请求行格式是固定的,标识了请求方法/请求URL和协议版本它们之间用空格间隔。

    请求头是我们为请求添加的附加信息,也就是一些额外的控制位。我们可以选择性的为请求添加请求头,除了一种特殊情况,POST 请求时请求头中必须包含  Content-Length 字段,用于标识请求体中的数据长度,来为本次请求的报文定界。

    除此之外,我们看一下平常生产中那些比较常见的请求头,常见的服务端与客户端对这些请求头的支持决定了我们的通信过程。

    常见的请求报文请求头

    Accept: 浏览器可接受的MIME类型。

    Accept-Charset:浏览器可接受的字符集。

    Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

    Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

    Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

    Content-Length:表示请求消息正文的长度。

    Host: 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

    If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。

    Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

    User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

    Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。

    Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

    From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

    Connection:处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

    Range:Range头域可以请求实体的一个或者多个子范围。例如,

    表示头500个字节:bytes=0-499

    表示第二个500字节:bytes=500-999

    表示最后500个字节:bytes=-500

    表示500字节以后的范围:bytes=500-

    第一个和最后一个字节:bytes=0-0,-1

    同时指定几个范围:bytes=500-600,601-999

    但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。

    UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

    -空行 
    它的作用是通过一个空行,告诉服务器请求头部到此为止。 
    -请求数据 
    若方法字段是GET,则此项为空,没有数据

    若方法字段是POST,则通常来说此处放置的就是要提交的数据

    比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。

    响应报文

    响应报文由三部分组成:响应行、响应头、空行、响应体。响应行一般由协议版本/状态码以及其描述组成。比较常见的状态码有以下几种:

    100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。

    200~299:表示成功接收请求并已完成整个处理过程。常用200

    300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(重定向),307和304(可以使用缓存,别来烦服务器了)

    400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)

    500~599:服务器端出现错误,常用500

    需要说明的是浏览器对 302 的反应:

    虽然RFC 1945和RFC 2068两个规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应 ,并且径自使用 GET 方式访问在 Location 中规定的 URI,而无视原先请求的方法,这是不规范的实现。
    因此状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。

    常见的响应报文响应头

    与请求头的作用一样。请求头是客户端为请求附加的控制位,告诉服务端本次请求该如何处理。响应头则是服务端为响应报文附加的控制位,告诉服务端该如何处理响应的数据。

    设置HTTP响应头往往和状态码结合起来发挥作用的。

    比如,代表重定向的几个状态码会与响应头中的 Location 字段成对出现,客户端收到重定向状态码则以自己的方式请求Location中的地址。在服务端,我们使用 sendRedirect 即可直接设置 Location  字段。

    再比如 401(Unauthorized) 无权限访问状态代码会与一个WWW-Authenticate头成对出现,告诉客户端需要提供何种的授权信息。

    当然除此之外,即使没有状态码对应,响应头也可以自己发挥相应的作用。比如大名鼎鼎的 Cookie,指定修改日期,指示浏览器按照指定的间隔刷新页面,声明文档的长度以便利用持久HTTP连接等等。有些状态码需要结合响应头使用,告诉客户端下一步该怎么办,但响应头并不一定需要结合状态码使用,它们本身就是一些控制位。只要客户端支持便可以单独发挥作用。

    Allow:服务器支持哪些请求方法(如GET、POST等)。

    Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE4、IE5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept- Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

    Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。因为短链接并不存在报文定界问题,我们只要将缓冲区中的数据全部读入便是一次完整的请求。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

    Content- Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置 Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。

    Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

    Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。

    Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。

    Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

    Refresh:告诉浏览器隔多久刷新一次,以秒计。

    Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。

    Set-Cookie:设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。

    Transfer-Encoding:告诉浏览器数据的传送格式。

    WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=”executives”“)。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问。

    注:设置应答头最常用的方法是HttpServletResponse的setHeader,该方法有两个参数,分别表示应答头的名字和值。和设置状态代码相似,设置应答头应该在发送任何文档内容之前进行。

    setDateHeader方法和setIntHeadr方法专门用来设置包含日期和整数值的应答头,前者避免了把Java时间转换为GMT时间字符串的麻烦,后者则避免了把整数转换为字符串的麻烦。

    HttpServletResponse还提供了许多设置 VIP 响应头的方法,因为它们被使用的频率实在太高了:

    setContentType:设置Content-Type头。大多数Servlet都要用到这个方法。

    setContentLength:设置Content-Length头。对于支持持久HTTP连接的浏览器来说,这个函数是很有用的。

    addCookie:设置一个Cookie(Servlet API中没有setCookie方法,因为应答往往包含多个Set-Cookie头)。 
    -空行 
    -响应体 
    响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。

    除上述常见的请求头与响应头外,还有一些请求与响应均可以使用的头部字段称为通用头。

    通用头

    通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个通用头域。

    常见通用头含义:

    Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

    Public指示响应可被任何缓存区缓存。 Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache指示请求或响应消息不能缓存 no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    Date:表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

    Pragma:用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。 

    最后一个实体头:

    实体头

    实体标头是描述消息正文内容HTTP标头实体标头用于HTTP请求和响应中。头状Content-LengthContent-LanguageContent-Encoding是实体头。

    即使实体标头既不是请求标头也不是响应标头,它们通常也包含在这些术语中。

    在以下示例中,Content-Length是实体头,而HostUser-Agent请求头。

    POST /myform.html HTTP/1.1
    Host: developer.mozilla.org
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
    Content-Length: 128

    实体头也是请求头部的一部分,只是因为它们是用来描述报文正文内容的标头,所以被单独列了一个分类,本质上与其它类型的头部字段没有区别。

    头部就是用来为报文附加额外的控制信息的,它们想要发挥作用需要基于服务端和客户端对它们的支持,本质上只是通信双方约定好的控制位。我们需要着重了解的是主流的服务端与客户端常用的那些控制位,以此可以窥探双方通信的过程,使我们对整个通信的流程有更深的把控。

  • 相关阅读:
    CentOS 6.5下快速搭建ftp服务器
    Ubuntu增加swap交换空间的步骤
    mysql官方下载安装教程(centos)
    阿里云上遇到: virtual memory exhausted: Cannot allocate memory
    解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误
    centos安装nodejs和配置npm
    JavaScript(二)-精简
    JavaScript(一)
    ease,seae-in,ease-in-out,ease-out区别
    安装 sass 文档
  • 原文地址:https://www.cnblogs.com/niuyourou/p/12582028.html
Copyright © 2020-2023  润新知