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协议安全

  • 相关阅读:
    sun.misc.BASE64Encoder找不到的解决方法
    eclipse里大小写转化的快捷键是什么
    jface viewer 理解
    如何在遗留代码基础上开发
    谈谈技术文档的编写
    jre build path 中的限制问题导致一些代码无法编译..如果设置
    android update automatically ( android 自动升级)
    各大集群存储产品点评
    关于@Autowired 注释为何不需要get Set
    VRML之desk
  • 原文地址:https://www.cnblogs.com/jtlgb/p/9962273.html
Copyright © 2011-2022 走看看