本文查阅方法:
一、查阅目录 —— 查阅本文目录,肯定想要查阅的目录标题
二、快捷“查找” —— 在当前浏览器页面,按键 “Ctrl+F” 按键组合,开启浏览器的查找功能,
在查找搜索框中 输入须要查阅的 目录标题,即可以直接到达 标题内容 的位置。
三、学习小结 —— 文中的学习小结内容,是笔者在学习以后总结出的,开发时可直接参考其进行应用
开发的内容, 进一步加快了本文的查阅 速度。(水平有限,仅供参考。)
html
本文目录 web
学习小结apache
一、什么是HTTP协议 浏览器
二、HTTP协议简介缓存
三、HTTP1.0和HTTP1.1的区别tomcat
四、HTTP请求 概述服务器
五、HTTP请求的细节——请求行网络
六、HTTP请求的细节——经常使用消息头jsp
七、HTTP响应 概述工具
八、HTTP响应的细节——状态行
九、HTTP响应细节——经常使用响应头
十、Http请求经常使用响应头信息范例Demo
十一、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
一、什么是HTTP协议
HTTP协议用于定义客户端与web服务器通迅的格式。客户端连上web服务器后,若想得到web服务器中的某个web资源,需遵照必定的通信格式,HTTP协议就是用于定义通迅格式的协议。
【技巧:安装IE浏览器插件HttpWatch,查看IE浏览器经过HTTP协议获取某个页面。可使用telnet程序连上web服务器,并使用HTTP协议获取某个页面,快速了解 HTTP协议的做用。】
二、HTTP协议简介
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
HTTP协议是学习JavaWEB开发的基石,不深刻了解HTTP协议,就不能说掌握了WEB开发,更没法管理和维护一些复杂的WEB站点。
HTTP协议的版本:HTTP/1.0、HTTP/1.1
三、HTTP1.0和HTTP1.1的区别
在HTTP1.0协议中,客户端与web服务器创建链接后,只能得到一个web资源。
在HTTP1.1协议中,容许客户端与web服务器创建链接后,在一个链接上获取多个web资源。
使用telnet举例说明。
命令行:telnet localhost 8080
【小知识:Telnet默认不回显数据,须要按键“Ctrl+]”,再按回车键,就会启动数据回显,就能够看到输入的字符】
问题:一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几回服务器,即向服务器发送了几回HTTP请求。(4次)
【小知识:页面优化技术原则之一:尽可能减小浏览器请求资源的次数】
四、HTTP请求 概述
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括以下内容:
一个请求行、若干消息头、以及实体内容,以下所示 :
五、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方式的特色:传送的数据量无限制。
六、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:客户端经过这个头字段告诉服务器,请求完成后,是保持连接仍是关闭连接
七、HTTP响应 概述
一个HTTP响应表明服务器向客户端回送的数据,它包括:
一个状态行、若干消息头、以及实体内容 。
八、HTTP响应的细节——状态行
状态行
格式: HTTP版本号 状态码 缘由叙述<CRLF>
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,以下所示:
九、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通知浏览器是否使用缓存的数据,精确到毫秒级。(通常的服务器不须要这么严谨)
十、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);
}
}
十一、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();
}
}