先看一下百度百科的http协议定义:
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出
http协议的版本:HTTP/1.0 , HTTP1.1 。 区别:前者与主机连接上只能获取一个资源,后者可以获取多个资源
http协议是学习javaEE的基石。
http请求:
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送一个HTTP请求,一个完整的http请求包括如下内容:一个请求行,若干消息头,以及实体内容。
举例:
GET /books/java.html HTTP/1.1 ==>请求头:描述客户端的请求方式,请求资源名称,http协议版本号
Accept : */* ==>多个消息头:描述客户端请求哪台主机,客户端的一些环境信息等。
Accept-Encoding:gzip,deflate
......
==>一个空行
这里是消息体
说明:
请求行
请求行中的GET称之为请求方式,请求方式有:
POST,GET,HEAD,OPTIONS,DELETE,TRACE,PUT.
不管是POST或GET,都用于向服务器请求莫个WEB资源,这两种方式的区别主要表现在数据传递上:
如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&分割,例如:
GET /mail/1.html?name=abc&password=xyz http/1.1
GET方式的特点:在url地址后附带的参数是有限制的,其数据容量通常不能超过1K。
如请求方式为post方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
消息头:
用于http请求中的常用头
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.org/index.jsp(客户机从哪个资源来访问服务器的,防盗链)
User-Agent:Mozilla/4.0 (compatible;MSIE5.5;WIndows NT 5.0) (客户机的软件环境)
Cookie:(客户机通过这个头可以向服务器带数据)
Connection:close/Keep-Alive
Date:Tue,11 Jul 200- 18:23:51 GMT
HTTP响应:
一个HTTP响应代表服务器向客户端会送的数据,它包括:
一个状态行,若干消息头,以及实体内容。
状态行
格式:HTTP版本号 状态码 原因叙述
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,他是一个三位的十进制数,响应状态码分为5类
100~199 : 成功接受请求,要求客户端继续提交下一次请求才能完成整个处理过程。
200~299 :表示成功请求已完成整个处理过程,例如200
300~399 :为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302,307,304.
400~499 : 客户端的请求有错误,常用404
599~599 : 服务器端出现错误,常用500
响应头:
Location: http://www.xxx.com/index.jsp (这个头配合302状态码使用,用于告诉客户找谁。
Server : Apache tomcat (服务器通过这个头,告诉浏览器服务器的类型。
Content-Encoding:gzip (数据的压缩格式)
Content-Length : 80(告诉浏览器回送数据的长度)
Content-Type : text/html;charset=GB2312( 告诉浏览器回送数据的类型)
Last-Modified : Tue,11 Jul 2000 18:23:51 GMT 告诉浏览器但前资源缓存时间
Refresh : 1;url=http://www.it315.org (告诉浏览器多长时间刷新一次(可以接网址,代表多少秒后跳转))
Content-Dispositon: attchment;filename=aaa.zip (告诉浏览器以下载方式打开数据)
Transfer-Encoding: chunked (数据传送格式)
ETag:W/"7777-1242234904000" (缓存相对的头)
Expires:回送的资源缓存多长时间,-1或0 代表不缓存
Cache-Control:no-chche
Pragma:no-cache
服务器通过以上两个头,也是控制浏览器不要缓存数据
如何传送压缩数据格式:
public void doGet(HttpServletRequest request, HttpServletReponse response) Throws Excepton{
String data = "aaaa";
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
byte gzip[] = bout.toByteArray();
response.setHeader("Content-Encoding","gzip");
response.setHeader("Content-Length",gzip.length);
response.getOutputStream.write(gzip);
}
显示图片
public void doGet(HttpServletRequest request, HttpServletReponse response) Throws Excepton{{}
response.setHeader("content-type","image/bmp");
InputStream in = this.getServletContext().getResourceAsStream("1.bmp");
int len = 0;
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
以下载方式打开图片
public void doGet(HttpServletRequest request, HttpServletReponse response) Throws Excepton{
response.setHeader("content-disposition","attachment;filename=3.jpg");
InputStream in = this.getServletContext().getResourceAsStream("3.jpg");
int len = 0;
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
}
原文:http://my.oschina.net/u/2272593/blog/374594