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. 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

  ② 请求头:

  1. 2 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg......
  2. 3 Accept-Language: zh-CN
  3. 4 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; ......
  4. 5 Accept-Encoding: gzip, deflate
  5. 6 If-Modified-Since: Tue, 26 Dec 2017 09:57:23 GMT
  6. 7 If-None-Match: W/"480-1514282243853"
  7. 8 Host: localhost:8080
  8. 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. 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. response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000);

  

3 HTTP 协议的更多相关文章

  1. HTTP协议系列(1)

    一.为什么学习Http协议       首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...

  2. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  3. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

  4. 协议森林16 小美的桌号(DHCP协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...

  5. 简约之美Jodd-http--深入源码理解http协议

    Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架.简单,却很强大! jodd-http是一个轻巧的HTTP客户端.现在我们以一个简单的示例从源码层看看是如何实现的? Http ...

  6. 【JavaScript】javascript中伪协议(javascript:)使用探讨

    javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...

  7. SNMP简单网络管理协议

    声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...

  8. 海鑫智圣:物联网漫谈之MQTT协议

    什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...

  9. linux-图形化远程管理协议

    远程管理控制方式: RDP(remote desktop protocol)协议: telnet: SSH(Secure Shell): RFB(Remote FrameBuffer)协议(图形化远程 ...

  10. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

随机推荐

  1. B树索引分裂

    一.索引分裂 1.  什么是分裂 在开始介绍之前,我们先来搞清楚什么是索引分裂吧.“索引分裂”就是索引块的分裂,当一次DML事务操作修改了索引块上的数据,但是旧有的索引块没有足够的空间来容纳新修改的数 ...

  2. 【css】怎么让Chrome支持小于12px 的文字

    谷歌浏览器Chrome是Webkit的内核,有一个 -webkit-text-size-adjust 的私有 CSS 属性,通过它即可实现字体大小不随终端设备或浏览器影响.CSS样式定义如下:-web ...

  3. 【转】git-stash用法小结

    https://www.cnblogs.com/tocy/p/git-stash-reference.html 缘起 今天在看一个bug,之前一个分支的版本是正常的,在新的分支上上加了很多日志没找到原 ...

  4. 记一次InputStream引起的乱码

    项目上线一周后,正准备看新闻的我突然接到了一个任务.线上突然出现了一条乱码的数据,需要解决这个bug.于是我放下了手中的保温杯,开始解决这个bug.经过一番折腾,发现是有一个同事在处理IO流上写得有点 ...

  5. Volley使用

    Volley是常用的网络请求框架,主要的用法如下: 获取字符串: public static void volleyTest1(final Context context){ RequestQueue ...

  6. 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

    在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有 ...

  7. Java之所有输入流输出流的分类

    (1)字节输入流        基类:InputStream        FileInputStream.ByteArrayInputStream.PipedInputStream.Buffered ...

  8. 简单的词法设计——DFA模拟程序

    实验一.简单的词法设计--DFA模拟程序 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 DFA 模 ...

  9. tensorflow-gpu安装的一些注意

    按正确的顺序安装,严格安装特定的版本 1,下载和安装严格版本的cuda和cuDnn,其他版本的不干活.比如要求9.0你就不能装9.1.https://www.tensorflow.org/instal ...

  10. Django signals 信号作用及用法说明

    参考:https://docs.djangoproject.com/en/1.11/ref/signals/ 1.Model signals django.db.models.signales 作用于 ...