zoukankan      html  css  js  c++  java
  • Http协议学习小结

    1.Http基本概述:

    HTTP(hypertext transport protocol),即超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。

    HTTP就是一个通信规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。

    2.Http组成:

    请求协议

    请求协议分为四部分,格式如下:

    1.请求首行;请求方式 请求路径  请求协议/请求版本. Get http://xxx.com HTTP/1.1

    2.请求头信息;键值对

    3.空行; 分隔符.请求体和请求头

    4.请求体。

    其中,post和get两种提交方式带来的请求协议有所不同,下面分类进行阐述和比较。

    2-1 get方式请求

    GET /hello/index.jsp HTTP/1.1(请求首行,get没有请求体或者理解为请求体是空白)

    Host: localhost

    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Accept-Language: zh-cn,zh;q=0.5

    Accept-Encoding: gzip, deflate

    Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

    Connection: keep-alive

    Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98(请求头,请求头由key/value组成。)

    这个位置虽然没有东西,但很重要,它是空行。如果有请求体,那么请求体在空行的下面

    l  GET /hello/index.jsp HTTP/1.1:GET请求,请求服务器路径为/hello/index.jsp,协议为1.1;

    l  *Host:localhost:请求的主机名为localhost;

    l  *User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:与浏览器和OS相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的;

    l  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8:告诉服务器,当前客户端可以接收的文档类型,其实这里包含了*/*,就表示什么都可以接收;

    l  Accept-Language: zh-cn,zh;q=0.5:当前客户端支持的语言,可以在浏览器的工具à选项中找到语言相关信息;

    l  Accept-Encoding: gzip, deflate:支持的压缩格式。数据在网络上传递时,可能服务器会把数据压缩后再发送;

    l  Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客户端支持的编码;

    l  Connection: keep-alive:客户端支持的链接方式,保持一段时间链接,默认为3000ms;

    l  *Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因为不是第一次访问这个地址,所以会在请求中把上一次服务器响应中发送过来的Cookie在请求中一并发送去过;这个Cookie的名字为JSESSIONID。

    2-2post请求方式

    为了演示POST请求,我们需要修改index.jsp页面,即添加一个表单:

    <form action="" method="post">
      关键字:<input type="text" name="keyword"/>
      <input type="submit" value="提交"/>
    </form>

    打开HttpWatch,输入hello后点击提交,查看请求内容如下:

    POST /hello/index.jsp HTTP/1.1(请求首行)

    Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*

    Referer: http://localhost:8080/hello/index.jsp

    Accept-Language: zh-cn,en-US;q=0.5

    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

    Content-Type: application/x-www-form-urlencoded

    Accept-Encoding: gzip, deflate

    Host: localhost:8080

    Content-Length: 13

    Connection: Keep-Alive

    Cache-Control: no-cache

    Cookie: JSESSIONID=E365D980343B9307023A1D271CC48E7D

    (请求头,下面是空行)

    keyword=hello(请求体,上面是空行。)

    POST请求是可以有体的,而GET请求有请求体(请求体是空白)

    Referer: http://localhost:8080/hello/index.jsp请求来自哪个页面,例如你在百度上点击链接到了这里,那么Referer:http://www.baidu.com;如果你是在浏览器的地址栏中直接输入的地址,那么就没有Referer这个请求头了;

    Content-Type: application/x-www-form-urlencoded表单的数据类型,说明会使用url格式编码数据;url编码的数据都是以“%”为前缀,后面跟随两位的16进制,例如“传智”这两个字使用UTF-8url编码用为“%E4%BC%A0%E6%99%BA”;

    Content-Length:13请求体的长度,这里表示13个字节。

    keyword=hello请求体内容!hello是在表单中输入的数据,keyword是表单字段的名字。

    Referer请求头是比较有用的一个请求头,它可以用来做统计工作,也可以用来做防盗链。

     

    统计工作:我公司网站在百度上做了广告,但不知道在百度上做广告对我们网站的访问量是否有影响,那么可以对每个请求中的Referer进行分析,如果Referer为百度的很多,那么说明用户都是通过百度找到我们公司网站的。

    防盗链:我公司网站上有一个下载链接,而其他网站盗链了这个地址,例如在我网站上的index.html页面中有一个链接,点击即可下载JDK7.0,但有某个人的微博中盗链了这个资源,它也有一个链接指向我们网站的JDK7.0,也就是说登录它的微博,点击链接就可以从我网站上下载JDK7.0,这导致我们网站的广告没有看,但下载的却是我网站的资源。这时可以使用Referer进行防盗链,在资源被下载之前,我们对Referer进行判断,如果请求来自本网站,那么允许下载,如果非本网站,先跳转到本网站看广告,然后再允许下载。

    相应协议

    相应协议同样分为四部分,组成框架如下:

    1.相应首行:

    2.响应头:键值对形式

    3.相应空行

    4.相应体

    相应内容是由服务器发送给浏览器的内容,浏览器会根据相应内容进行显示,比如显示相应体中的html代码。

    HTTP/1.1 200 OK (相应首行)

    Server: Apache-Coyote/1.1

    Content-Type: text/html;charset=UTF-8

    Content-Length: 724

    Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello

    Date: Wed, 25 Sep 2012 04:15:03 GMT

    响应头

     (空行)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

      <head>

        <base href="http://localhost:8080/hello/">

       

        <title>My JSP 'index.jsp' starting page</title>

             <meta http-equiv="pragma" content="no-cache">

             <meta http-equiv="cache-control" content="no-cache">

             <meta http-equiv="expires" content="0">   

             <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

             <meta http-equiv="description" content="This is my page">

             <!--

             <link rel="stylesheet" type="text/css" href="styles.css">

             -->

      </head>

     

      <body>

    <form action="" method="post">

      关键字:<input type="text" name="keyword"/>

      <input type="submit" value="提交"/>

    </form>

      </body>

    </html>相应体

    HTTP/1.1 200 OK:响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释;

    Server: Apache-Coyote/1.1:服务器的版本信息;

    Content-Type: text/html;charset=UTF-8:响应体使用的编码为UTF-8;

    Content-Length: 724:响应体为724字节;

    Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:响应给客户端的Cookie;

    Date: Wed, 25 Sep 2012 04:15:03 GMT:响应的时间,这可能会有8小时的时区差;

    下面是两张利用Fiddler实际捕捉的两张协议的截图,便于理解。

  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/insistence/p/5976427.html
Copyright © 2011-2022 走看看