• 3 HTTP 协议


    1 什么是HTTP 协议

    HTTP (HyperText Transfer Protocol),即超文本传输协议, 17年以前互联网上应用最广泛的协议,之后所有网站都开始使用HTTPS协议(基于HTTP协议),在学习HTTPS协议之前,得先知道HTTP 协议的工作原理。HTTP 协议是一个基于请求与响应模式的,无状态的,应用层协议,它基于TCP链接(三次握手),HTTP1.1版本中给出一种持续链接的机制,目前绝大多数Web 开发都是构建在HTTP协议之上的。
    ① HTTP协议全称是超文本传输协议
    ② 建立在TCP/IP基础之上
    ③ HTTP协议版本,1.0(短连接), 1.1(长连接),目前通用版本是1.1

    主要特点:

    ① 支持客户端/服务器端模式。浏览器可以和服务器通过HTTP协议进行交互

    ② 简单快速:客户想服务器端请求服务时,只需要传送请求方法和路径。请求方法通常有GET,POST,HEAD,每种方法都规定了客户与服务器联系的类型。由于HTTP协议简单,使得HTTP服务器规模小,通信速度快

    ③ 灵活:HTTP 允许传输任意类型的数据对象。传输的类型由 Content-Type 标记

    ④ 无状态:对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则必须重新传送。但是如果不需要前面的信心时,传递速度会很快

    ⑤ 无连接:在HTTP1.0时,请求响应之后就断开。HTTP1.1之后,请求不会立即断开而是链接一段时间后,如果没有后续请求才会断开

     

    2 URL

    学习HTTP 协议还得了解URL的基本概念,HTTP URL(统一资源定位符),就是日常我们访问网站要输入的网址全称,标准格式如下:

    http://host[:port][abs_path]

    ① host 表示主机域名或者IP地址

    ② port 表示端口号,没有的时候表示使用默认缺省端口80

    ③ abs_path:指定请求资源的URI

    当我们在浏览器输入www.baidu.com时,最后百度会显示完整的URL格式

    https://www.baidu.com/

    baidu 表示域名,浏览器会在DNS服务器中查找该域名对应的IP地址

    网址里没有端口号,表示该域名使用的是默认的端口号80

    没有输入URI,浏览器会默认在其后加 / 作为结束

     

    3 HTTP 请求

    客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括如下内容:

      ① 一个请求行;

      ② 若干请求头;

      ③ 请求实体内容;

      一个完整的HTTP请求

    1 GET /UserManager/Test.html HTTP/1.1
    2 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg......
    3 Accept-Language: zh-CN
    4 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; ......
    5 Accept-Encoding: gzip, deflate
    6 If-Modified-Since: Tue, 26 Dec 2017 09:57:23 GMT
    7 If-None-Match: W/"480-1514282243853"
    8 Host: localhost:8080
    9 Connection: Keep-Alive

      ① 请求行:

    1 GET /UserManager/Test.html HTTP/1.1

    A. 请求方式:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT、CONNECT等。其中常用的请求方式为POST与GET。它们的区别如下:

    POST 将参数封装到请求体中,安全级别高,支持大数据

    GET 将参数直接显示到地址栏,安全级别低,不支持大数据

    B. 请求地址:即请求服务器的某个资源, /UserManager/Test.html

      C. 协议版本:HTTP/1.1

      ② 请求头:

    2 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg......
    3 Accept-Language: zh-CN
    4 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; ......
    5 Accept-Encoding: gzip, deflate
    6 If-Modified-Since: Tue, 26 Dec 2017 09:57:23 GMT
    7 If-None-Match: W/"480-1514282243853"
    8 Host: localhost:8080
    9 Connection: Keep-Alive

    Accept:   [告诉服务,我可以接受文件类型]

    Referer:  [告诉服务器我来自哪里,该消息头常用于防止盗连]

    Accept-Language:  [接受的字符编码]

    User-Agent: [告诉服务器浏览器的内核是什么]

    Accept-Encoding:  gzip, deflate [接受gzip, deflate压缩数据]

    If-Modified-Since:  Tue, 26 Dec 2017 09:57:23 GMT  [告诉服务器我的缓存中有这个文件,文件的时间是]

    If-None-Match:

    Host:       [访问的主机名]

    Connection:  [是否保持连接]

     

    4 HTTP 响应

    响应与请求类似,分为响应行,响应头,响应体

    一个完整的HTTP响应

     1 HTTP/1.1 302 Moved Temporarily      响应行
     2 Date: Wed, 27 Dec 2017 14:57:34 GMT   加粗的是响应头,冒号之后是响应头对应的响应体
     3 Content-Type: text/html 
     4 Content-Length: 215
     5 Connection: Keep-Alive
     6 Set-Cookie: BAIDUID=4D949610A08D7F289ADF189603720597:FG=1; 【cookie 信息】
     7 Set-Cookie: expires=Thu, 31-Dec-37 23:55:55 GMT;
     8 Set-Cookie: max-age=2147483647; path=/; domain=.baidu.com
     9 Set-Cookie: BD_LAST_QID=11558213965171471972;
    10 P3P: CP=" OTI DSP COR IVA OUR IND COM "
    11 Location: https://www.baidu.com/ [让浏览器重新定位到url]
    12 Server: BWS/1.1 [告诉浏览器 web服务器]
    13 X-UA-Compatible: IE=Edge,chrome=1
    14 Refresh:1;url=http://www.baidu.com [设置浏览器多少秒跳转到某个页面]
    15 Content-Diposition:attachment;filename=2.png
    16 Transfer-Encoding:chunked    [传输的编码]
    17 Expires:-1     [告诉浏览器如何缓存数据]
    18 Cache-Control:no-cache   [告诉浏览器如何缓存数据]
    19 Pragma:no-cache              [告诉浏览器如何缓存数据]

    HTTP 常见响应状态说明

    200:请求与响应过程没有发生错误

    302: 当请求一个资源时,服务器返回302表示让浏览器转向到另外一个资源

    404:找不到资源

    500:服务器端出问题了(Internal Server Error)

     

    案例1:下载图片

    通过HTTP请求,客户端从服务器端下载一个图片

     1      //获取要下载文件的全路径
     2         String path = this.getServletContext().getRealPath("images/2.png");
     3         
     4         //获取文件名
     5         String filename= path.substring(path.lastIndexOf("\")+1);
     6         //需要对文件名进行转码
     7         String encodeFileName= URLEncoder.encode(filename, "UTF-8");
     8         response.setHeader("content-disposition", "attachment;filename=" + encodeFileName);
     9         
    10         //创建文件输入流
    11         FileInputStream fis = new FileInputStream(path);
    12         //做一个缓冲字节数组
    13         byte buff[] = new byte[1024];
    14         //实际每次读取了多少个字节
    15         int len=0;
    16         //创建输出流对象
    17         OutputStream os = response.getOutputStream();
    18         while((len=fis.read(buff))>0)
    19         {
    20             os.write(buff,0,len);
    21         }
    22         
    23         //关闭文件流
    24         if(fis!=null)
    25         {
    26             fis.close();
    27         }
    28 
    29         if(os!=null)
    30         {
    31             os.close();
    32         }

      

      案例2:不让客户端浏览器缓存页面,因为有时候用户习惯通过Enter 键取页面,就会默认从Cache中取数据,导致客户端页面更新不及时

      在Servlet 开始前设置页面不缓存,加入下列代码即可:

    1 //指定该页面不缓存
    2 response.setDateHeader("Expires", -1);
    3 response.setHeader("Cache-Control", "no-cache");
    4 response.setHeader("Pragma", "no-cache");

      或者指定客户端的网页在一定时间内失效

    1 2 //指定该页面缓存一个小时失效
    3 response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000);

      

     

     

  • 相关阅读:
    通过CMMI5的国内企业有几个?这个认证是不是很牛啊?
    CNUTCon 全球运维技术大会2017
    新浪微博基于Docker的混合云架构与应用实践-DockerInfo
    k8s~为服务添加ingress的实现
    springboot~HttpPut开启application/x-www-form-urlencoded
    K8s~为pod添加sidecar进行日志收集
    k8s~部署EFK框架
    springboot~Transactional注解的注意事项
    CentOS 6.4 快速安装Nginx笔记
    去掉NSString中的HTML标签
  • 原文地址:https://www.cnblogs.com/Latiny/p/8367500.html
Copyright © 2020-2023  润新知