zoukankan      html  css  js  c++  java
  • HTTP响应报文结构

    HTTP响应报文由三部分组成:响应行、响应头、响应体。

    一、响应行:协议版本+状态码+描述

      常见状态码:

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

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

      300-399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)

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

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

    二、响应头

      响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述金星秀,可以通知客户端如何处理等一会儿它回送的数据。

      设置HTTP响应头往往和状态码结合起来。例如,有好几个表示“文档位置已经改变”的状态码都伴随着一股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连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStream,完成后查看其大小,然后把该值放入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状态码使用,用于重定向接收者到一个新URL地址。表示客户应当到哪里去提取文档。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还提供了许多设置:

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

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

      3.addCookie:设置一个Cookie(Servlet API中没有setCookie方法,因为应答往往包含多个Set-Cookie头)。

    三、响应体

      响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。

      HTTP响应报文格式就如下图所示

      HTTP的头域包括通用头、请求头、响应头和实体头。

      1.通用头域

      通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgramde、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指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

      ~~ mix-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

      ~~ max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

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

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

      

      2.实体头域

      请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。

      extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding和Content-Type定义,它的长度由Content-Length或Content-Range定义。

      常见实体头含义:

      Content-Encoding:服务器通过这个头告诉浏览器数据的压缩格式。

      Content-Length:服务器通过这个头告诉浏览器回送数据的长度。

      Content-Dispositon:告诉浏览器以下载方式打开数据。

      Content-Type:服务器通过这个头告诉浏览器回送数据的类型。Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型。

      Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

      Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entiy-legth

      例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234,如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

      Last-Modified:指定服务器上保存内容的最后修订实际。

      ETag:缓存相关的头。

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

      

      其中三种禁止浏览器缓存的头字段:

      Expires:-1或0

      Cache-Control:no-cache

      Pragma:no-cache

    GET、POST区别

      HTTP定义了与服务器交互的不同方法,最基本的方法有4种:GET、POST、PUT、DELETE。

      而HTTP中的GET、POST、PUT、DELETE就对应着对URL资源的查、改、增、删4个操作。所以说:GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

      主要区分一下get和post

      1.提交数据的形式:

      GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),会直接展现在地址栏中,以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。

      如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

      而POST方法则会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数

      2.提交数据的大小

      get方法提交数据的大小直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响:比如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

      post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。

      所以大小的限制还是得受各个web服务器配置的不同而影响。

      3.提交数据的安全

      POST比GET方式的安全性要高

      通过GET提交数据,用户名和密码将明文出现在URL上,因为一下几个原因get方式安全性会比post弱:

      (1)登录页面有可能被浏览器缓存

      (2)其他人查看浏览器的历史纪录,那么别人就可 以拿到你的账号和密码了

      (3)当遇上跨站的攻击时,安全性的表现更差了

  • 相关阅读:
    SGU 271 Book Pile (双端队列)
    POJ 3110 Jenny's First Exam (贪心)
    HDU 4310 Hero (贪心)
    ZOJ 2132 The Most Frequent Number (贪心)
    POJ 3388 Japanese Puzzle (二分)
    UVaLive 4628 Jack's socks (贪心)
    POJ 2433 Landscaping (贪心)
    CodeForces 946D Timetable (DP)
    Android Studio教程从入门到精通
    Android Tips – 填坑手册
  • 原文地址:https://www.cnblogs.com/susanhonly/p/8447023.html
Copyright © 2011-2022 走看看