Http 协议详解 学习笔记
本文查阅方法:
1、查阅目录 —— 查阅本文目录,确定想要查阅的目录标题
2、快捷“查找” —— 在当前浏览器页面,按键 “Ctrl+F” 按键组合,开启浏览器的查找功能,
在查找搜索框中 输入需要查阅的 目录标题,便可以直接到达 标题内容 的位置。
3、学习小结 —— 文中的学习小结内容,是笔者在学习之后总结出的,开发时可直接参考其进行应用
开发的内容, 进一步加快了本文的查阅 速度。(水平有限,仅供参考。)
本文目录
学习小结
1、什么是HTTP协议
2、HTTP协议简介
3、HTTP1.0和HTTP1.1的区别
4、HTTP请求 概述
5、HTTP请求的细节——请求行
6、HTTP请求的细节——常用消息头
7、HTTP响应 概述
8、HTTP响应的细节——状态行
9、HTTP响应细节——常用响应头
10、Http请求常用响应头信息范例Demo
11、HTTP其他实用头字段及其Demo
学习小结
(1)HTTP请求:请求行常用两种请求方式:
a. Get方式:数据在URL地址后以“?”的形式附带,多个数据用“&”分隔,数据容量小于1k;
b. Post方式:数据在 实体 部分, 数据容量无限制。
(2)HTTP请求常用消息头及Demo
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.it315.org:80
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:
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
(3)HTTP响应:状态行 常用状态码
200:请求响应正常;
302:要浏览器去找响应群殴Location头信息所标注的资源;
304/307:要浏览器去拿浏览器缓存数据;
404:找不到资源,建议检查访问路径;
500:服务器处理访问时,出现问题,无法响应。
(4)HTTP响应常用消息头及Demo
Location: http://www.sina .org/index.jsp
Server:apache tomcat
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: 1;url=http://www.sina.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
ETag: W/"7777-1242234904000"
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
1、什么是HTTP协议
HTTP协议用于定义客户端与web服务器通迅的格式。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议就是用于定义通迅格式的协议。
【技巧:安装IE浏览器插件HttpWatch,查看IE浏览器通过HTTP协议获取某个页面。可以使用telnet程序连上web服务器,并使用HTTP协议获取某个页面,快速了解 HTTP协议的作用。】
2、HTTP协议简介
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。
HTTP协议的版本:HTTP/1.0、HTTP/1.1
3、HTTP1.0和HTTP1.1的区别
在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。
在HTTP1.1协议中,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
使用telnet举例说明。
命令行:telnet localhost 8080
【小知识:Telnet默认不回显数据,需要按键“Ctrl+]”,再按回车键,就会启动数据回显,就可以看到输入的字符】
问题:一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求。(4次)
【小知识:页面优化技术原则之一:尽量减少浏览器请求资源的次数】
4、HTTP请求 概述
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括如下内容:
一个请求行、若干消息头、以及实体内容,如下所示 :
5、HTTP请求的细节——请求行
请求行中的GET称之为请求方式,请求方式有七种:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT。而常用的有两种: GET 方式、 POST 方式。用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:
a.如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,
多个数据之间以&进行分隔,例如: GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
b.如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据.
Post方式的特点:传送的数据量无限制。
6、HTTP请求的细节——常用消息头
用于HTTP请求中的常用头:告诉服务器,浏览器的当前工作环境信息。
Demo样例:
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.it315.org:80
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:
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
请求头详解:
Accept: 用于告诉服务器,客户机所支持的数据类型
Accept-Charset: 用于告诉服务器,客户机所采用的码表
Accept-Encoding: 用于告诉服务器,客户机所支持的数据压缩格式
Accept-Language: 用于告诉服务器,客户机的语言环境
Host: 用于告诉服务器,客户机想访问服务器哪台主机
If-Modified-Since: 用于告诉服务器,客户机对于资源的最后缓存时间,精确到秒级。
Referer: 用于告诉服务器,客户机是从哪个页面去访问服务器的 (防盗链)
User-Agent: 用于告诉服务器,客户机的机器环境(例如所使用的操作系统,浏览器版本号)
Cookie:客户端通过这个头字段,可以带一些数据给服务器
Connection:客户端通过这个头字段告诉服务器,请求完成后,是保持链接还是关闭链接
7、HTTP响应 概述
一个HTTP响应代表服务器向客户端回送的数据,它包括:
一个状态行、若干消息头、以及实体内容 。
8、HTTP响应的细节——状态行
状态行
格式: HTTP版本号 状态码 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
9、HTTP响应细节——常用响应头
HTTP请求中的常用响应头
Demo样例:
Location: http://www.sina .org/index.jsp
Server:apache tomcat
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: 1;url=http://www.sina.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
ETag: W/"7777-1242234904000"
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
响应头详解
Location:这个头通常配合302状态码使用,服务器使用这个头告诉浏览器去找谁【范例见Demo1】
Server:服务器通过这个头告诉浏览器,服务器的类型
Content-Encoding: 服务器通过这个头告诉浏览器,数据的压缩格式(gzip) 【范例见Demo2】
一定要压缩服务器返回数据,既可提升服务器性能,又可大大减少服务器网络流量费用
Content-Length:服务器通过这个头告诉浏览器,回送数据的长度【范例见Demo2】
Content-Language: 服务器通过这个头告诉浏览器,回送数据的语言;
Content-Type: 服务器通过这个头告诉浏览器,回送数据的类型【范例见Demo3】
对于响应返回图片、视频、音频等数据类型时,很重要。
Last-Modified: 服务器通过这个头告诉浏览器,数据的最后修改时间,精确到秒级。
Refresh:服务器 告诉浏览器,多长时间定时刷新或定时转向其他页面 (论坛刷新)【范例见Demo4】
Content-Disposition: 控制浏览器以下载方式打开回送的数据【范例见Demo5】
对于响应返回图片、视频、音频等数据类型时,可能会用到。
Transfer-Encoding: 服务器通过这个头告诉浏览器,数据是以块方式回送的(用的少)
Expires:控制浏览器缓存数据的时间(-1或0,代表控制浏览器不要缓存)
时间+数据:保存该数据缓存的时间,eg:2012 12 12 (1.html)
Cache-Control: no-cache
Pragma: no-cache
以上三个头一起用,就可以控制所有的浏览器不要缓存数据
ETag:缓存相关,服务器给每一个网页都生成一个编码,用来进行比对,以配合304或307通知浏览器是否使用缓存的数据,精确到毫秒级。(一般的服务器不需要这么严谨)
10、Http请求常用响应头信息范例Demo
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test5(response);
}
【范例Demo1:Location 】
//指示浏览器重新定向
public void test1(HttpServletResponse response){
response.setStatus(302);
response.setHeader("location", "/day04/index.jsp");
}
【范例Demo2:Content-Encoding 】
// 演示数据压缩
public void test2(HttpServletResponse response) throws IOException{
String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; //数据太小可能会压缩后反而更大,当数据大时压缩效果才显著。
System.out.println("原始数据的大小:" + data.getBytes().length);
//下面代码是压缩数据。GZIPOutputStream 是JDK自带的gzip压缩工具类,需要将数据写入流中
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
byte gzipData[] = bout.toByteArray(); //获得gzip压缩后的数据
response.setHeader("Content-Encoding", "gzip"); //告诉浏览器压缩数据的格式
response.setHeader("content-length", gzipData.length+""); //数据大小
response.getOutputStream().write(gzipData); //返回浏览器
}
【范例Demo3:Content-Type 】
//content-type头字段的作用
public void test3(HttpServletResponse response) throws IOException{
String path = this.getServletContext().getRealPath("/02.jpg");
FileInputStream in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
response.setHeader("content-type", "image/jpeg");//此语句要在写数据前执行
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
【范例Demo4:Refresh 】
//控制浏览器定时刷新
public void test4(HttpServletResponse response) throws IOException{
response.setHeader("refresh", "3;url='http://www.sina.com'");
response.getWriter().write("你的页面 3 秒钟后将会转向新浪首页");
}
【范例Demo5:Content-Disposition 】
//控制浏览器下载
public void test5(HttpServletResponse response) throws IOException{
response.setHeader("content-disposition", "attachment;filename=02.jpg");
String path = this.getServletContext().getRealPath("/01.jpg");
FileInputStream in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
11、HTTP其他实用头字段 及其Demo
HTTP请求头字段
Range头指示服务器只传输一部分Web资源。这个头可以用来实现断点续传功能。
Range字段可以通过三种格式设置要传输的字节范围:
Range: bytes=1000-2000 : 传输范围从1000到2000字节。
Range: bytes=1000- : 传输Web资源中第1000个字节以后的所有内容。
Range bytes=1000 : 传输最后1000个字节。
由于浏览器并不支持该头字段,所以需要自己写客户端程序来实现该字段的功能。
HTTP响应消息头字段
Accept-Ranges:这个字段说明Web服务器是否支持Range,
支持则返回Accept-Ranges: bytes,
如果不支持,则返回Accept-Ranges: none.
Content-Range:指定了返回的Web资源的字节范围。这个字段值的格式是:
例子: Content-Range:1000-3000/5000
Demo样例:
public class DownLoad {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/day04/1.txt");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Range", "bytes=6-");
FileOutputStream out = new FileOutputStream("c:\\1.txt",true);
InputStream in = conn.getInputStream();
int len = 0;
byte buffer[] = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
上一篇: JSP页面生命周期
下一篇: maven中的生命周期和插件