zoukankan      html  css  js  c++  java
  • HTTP协议(Requset、Response)

    目录

    http协议

    http报文解析:

    Http请求(浏览器->服务器)

    HttpServletRequest对象:

     

    Http响应(服务器->浏览器)

    HttpServletResponse对象:


    http协议

    对浏览器客户端 和 服务器端 之间数据传输的格式规范。

    基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)

    无状态, 但是可用cookie技术在请求和响应报文中写入cookie信息来控制客户端的状态。

    连接步骤:

    域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器返回http响应,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户

    查看http协议报文的方法:

    1. 使用火狐的firebug插件(右键->firebug->网络)
    2. 使用谷歌的“审查元素”
    3. 使用系统自带的telnet工具(远程访问工具) 
      a)telnet localhost 8080 访问tomcat服务器
      b)ctrl+] 回车 可以看到回显
      c)输入请求内容

      d)回车,即可查看到服务器响应信息


    http报文解析:


    requset请求 数据格式

    Http请求报文(浏览器->服务器)

    1.  例:表单提交
    2. <form action="提交地址" method="GET/POST">
    3. 用户名:<input type="text" name="username"><br>
    4. 密码:<input type="text" name="password"><br>
    5. <input type="submit" value="登录"/>
    6. <form>

    点击登陆后查看HTTP报文: 

    1. 截取http请求报文分析:
    2. GET /WebRoot/hello HTTP/1.1 -- 请求行
    3. Host: localhost:8080 -- 请求头(多个key-value对象)
    4. User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
    5. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    6. Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
    7. Accept-Encoding: gzip, deflate
    8. Connection: keep-alive
    9. -- 一个空行
    10. username=123&password=123456 --(post)请求正文/实体内容

    ----------------------------------------------------------------------------请求行-----------------------------------------------------------------------------------

    GET   /WebRoot/hello   HTTP/1.1 

    开始访问资源请求一次,之后文件中每有一个地址都会请求一次

    #http协议版本

    http1.0:当前浏览器客户端与服务器端建立连接之后,只能发送一次请求,一次请求之后连接关闭。

    http1.1:默认使用长连接,当前浏览器客户端与服务器端建立连接之后,可以在一次连接中发送多次请求。(基本都使用1.1)

    #请求资源

    URL: 统一资源定位符。http://localhost:8080/WebRoot/hello。只能定位互联网资源。是URI 的子集。URL=协议+主机端口+URI

    URI: 统一资源标记符。/WebRoot/hello。用于标记任何资源。可以是本地文件系统、局域网的资源、 可以是互联网资源。

    #请求方式

    常见的请求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE

    常用的请求方式: GET 和 POST

    GET(获取资源)

    1. GET方法用来查询,不会对浏览器上的信息产生影响
    2. 参数数据跟在地址栏(URI)后。以?开头、多个参数之间以&分割:GET  /WebRoot/testMethod.html?name=123&password=123456  HTTP/1.1
    3. GET提交参数数据有限制,不超过1KB。(实际上URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制,IE对URL长度的限制是2083字节)
    4. GET方式采用的是明文传输,不适合提交敏感密码。
    5. 注意: 浏览器直接访问的请求,默认提交方式是GET方式。火狐浏览器以Get方式提交带参数的数据,会重复提交两次

    POST(传输实体主体)

    1. 参数跟在请求的实体内容中。没有?开头、多个参数之间以&分割
    2. POST提交的参数数据没有限制。
    3. POST方式放在报文内部无法看到,适合提交敏感数据。

    ------------------------------------------------------------------------------请求头---------------------------------------------------------------------------

    键值对,例:常见的请求头

    Accept: text/html,image/*                          -- 浏览器接受的内容类型
    Accept-Charset: ISO-8859-1                     -- 浏览器接受的编码格式
    Accept-Encoding: gzip,compress               --浏览器接受的数据压缩格式
    Accept-Language: en-us,zh-                      --浏览器接受的语言
    Host: www.it315.org:80                 --(必输)当前请求域名(主机:端口)
    Content-Type: application/x-www-form-urlencoded          --提交的数据类型
    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT            --浏览器最后的缓存时间
    Referer: http://www.it315.org/index.jsp                               -- 当前请求来自于哪里(可用来判断非法链接)
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)            --浏览器版本类型
    Cookie:name=123                                                               -- 浏览器保存的cookie信息
    Connection: close/Keep-Alive                       -- 浏览器跟服务器连接状态。close:连接关闭 keep-alive:保持连接
    Date: Tue, 11 Jul 2000 18:23:51 GMT          -- 请求发出的时间 

    Content-Type  常见的媒体格式类型如下:

        text/html : HTML格式
        text/plain :纯文本格式      
        text/xml :  XML格式
        text/x-markdown:markdown格式
        image/gif :gif图片格式    
        image/jpeg :jpg图片格式 
        image/png:png图片格式

    application/xhtml+xml :XHTML格式
    application/xml : XML数据格式
    application/atom+xml :Atom XML聚合格式
    application/json : JSON数据格式
    application/pdf :pdf格式
    application/msword : Word文档格式
    application/octet-stream : 二进制流数据(如常见的文件下载)
    application/x-www-form-urlencoded : <form encType="">中默认的encType(表单默认的提交数据的格式)

    form表单数据被编码以键值对形式?key1=value1&key2=value2的方式发送到服务器

    -----------------------------------------------------------------------------空行-------------------------------------------------------------------------------

    --------------------------------------------------------------------请求正文/实体内容-------------------------------------------------------------------------

    请求头和请求正文之间是一个空行,它表示请求头已经结束,接下来的是请求正文。

    只有POST提交的参数会放到实体内容中

    1. username=123&password=123456 --(post)请求正文/实体内容

    =======================================Servlet请求对象============================================

    HttpServletRequest对象:

    tomcat服务器把请求信息封装到HttpServletRequest对象,把响应信息封装到HttpServletResponse对象。然后调用servlet的方法,传入request和response对象

    HttpServletRequest对象用于获取请求数据,核心的API:

    请求行:

    request.getMethod();          获取请求方式

    request.getRequetURI(); /  request.getRequetURL();            获取请求资源

    request.getProtocol();           获取请求http协议版本

    request.getQueryString();           (获取GET方式传递的参数)

    请求头:

    request.getHeaderNames();            获取所有的请求头名称

    request.getHeader("名称");            根据请求头获取请求值

    实体内容:

    request.getInputStream();            获取实体内容数据(获取POST方式传递的参数)

    GET、POST请求参数 统一通用方便的获取方法:

    request.getParameterNames();          获取所有参数名称列表(参数名为 html表单中数据标签的name属性值)

    request.getParameter("参数名");         根据参数名获取参数值(只能获取一个值的参数)

    request.getParameterValue("参数名“);         根据参数名获取参数值(可以获取多个值的参数)

    编码问题:

    修改GET方式参数编码:

    手动解码:String name = new String(request.getParameter("参数名").getBytes("iso-8859-1"),"utf-8");

    修改POST方式参数编码:

    设置参数查询码表:request.setCharacterEncoding("utf-8");         放在查询参数之前,只对实体内容起作用

    改服务器配置文件:找到并在%tomcat%/conf/server.xml文件Connector标签中加入  URIEncoding="utf-8"

    请求案例:获取浏览器的类型(user-agent), 防止非法链接(referer)



    response响应 数据格式

    Http响应报文(服务器->浏览器)

    1. HTTP/1.1 200 OK --响应行
    2. Server: Apache-Coyote/1.1 --响应头(key-vaule)
    3. Content-Length: 24
    4. Date: Fri, 30 Jan 2015 01:54:57 GMT
    5. --一个空行
    6. this is hello servlet!!! --响应正文/实体内容

    -------------------------------------------------------------------------------响应行---------------------------------------------------------------------------

    HTTP/1.1  200  OK

    #状态码: 服务器处理请求的结果(状态)

    常见的状态:
    200: 表示请求处理完成并完美返回
    302: 表示请求需要进一步细化。
    404: 表示客户访问的资源找不到。
    500: 表示服务器的资源发送错误。(服务器内部错误)
    #状态描述

    --------------------------------------------------------------------------------响应头------------------------------------------------------------------------

    键值对,例:常见的响应头

    Location: 重定向地址                         --表示重定向的地址,该头和302的状态码一起使用。
    Server:apache tomcat                       --表示服务器的软件信息, 它和请求报头域User-Agent是相对应的
    Content-Encoding: gzip                     --表示服务器发送给浏览器的数据压缩类型
    Content-Length: 80                           --表示服务器发送给浏览器的实体正文长度
    Content-Language: zh-cn                  --表示服务器支持的语言
    Content-Type: text/html; charset=GB2312                       --表示服务器发送给浏览器的数据类型及内容编码
    Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT               --表示服务器资源的最后修改时间
    Refresh: 秒数;url=地址                                                     --表示定时刷新到指定页面
    Content-Disposition: attachment; filename=aaa.zip         --表示告诉浏览器以下载方式打开资源(下载文件时用到)
    Transfer-Encoding: chunked
    Set-Cookie:SS=Q0=5Lb_nQ; path=/search                    --表示服务器发送给浏览器的cookie信息(会话管理用到)
    Expires: -1                                                                       --响应过期时间,-1表示通知浏览器不进行缓存
    Cache-Control: no-cache                                                --同上
    Pragma: no-cache                                                           --同上
    Connection: close/Keep-Alive          --表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接 

    -----------------------------------------------------------------------响应正文/实体内容---------------------------------------------------------------------

    响应正文就是服务器返回给浏览器的资源的内容:html, css, js,甚至图片

    由响应头的Content-···等属性告知浏览器 响应正文的长度、编码、媒体类型等(MIME Type是经过 ietf 组织协商,以 RFC 的形式作为建议标准发布在网上的)

    由response对象PrintWriter写入数据内容

    =======================================Servlet响应对象============================================

    HttpServletResponse对象:

    tomcat服务器把请求信息封装到HttpServletRequest对象,把响应信息封装到HttpServletResponse对象。然后调用servlet的方法,传入request和response对象
    HttpServletResponse对象用于修改响应信息,核心的API:

    响应行:

    response.setStatus();           设置状态码

    响应头:

    response.setHeader("name","value");           设置响应头

    response.sendRedirect(url);         重定向

    response.setContentType("text/html;charset=utf-8");         发送给浏览器的数据类型 及内容编码

    实体内容:(浏览器直接能够看到)

    response.getWriter().writer();          发送字符实体内容

    response.getOutputStream().writer()          发送字节实体内容

    tomcat服务器把response对象的内容转换成响应格式内容,再发送给浏览器解析。

    编码问题:

    response.setCharacterEncoding("utf-8");         放在响应实体内容代码之前,对getOutputStream().writer()字节流不起作用

    响应案例:请求重定向(Location),定时刷新(refresh),content-Type数据类型(在tomcat服务器web.xml中用mime-type标签规定了数据类型,例如:text/html发送HTML文本;image/jpg发送图片)
     


    HTTPS协议  是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全

  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/jtlgb/p/9962273.html
Copyright © 2011-2022 走看看