Servlet学习笔记(二):Http协议详解

一、简介

1、Http,是超文本传输协议,是TCP/IP的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程。

2、版本:HTTP/1.0、HTTP/1.1,区别是1.1版本,客户端与服务器连接后,在一个连接上可以获取多个web资源。


二、HTTP请求

(一)客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送一个HTTP请求。

(二)内容:

1、一个完整的HTTP请求包括如下内容:一个请求行,若干消息头(请求头)、实体内容。

2、实例:



3、请求行:

1)描述客户端的请求方式:Get/Post.

①、用户如果没有设置,默认情况下浏览器发送的都是Get请求,例如在浏览器直接输地址、点超链接。

②、区别:Get可以在URL地址后带参数(?a&b),数据量有限制;Post可以再请求实体内容中发送数据,数据量无限制。

2)请求的资源名称

3)HTTP版本号:HTTP/1.1


4、消息头:客户请求主机 和 客户端环境信息

1)Accept: 指定客户端接受哪些类型的信息。*/*:支持任何类型。

2)Accept-Charset:指定客户端接受的字符集。如,Accept-Charset:iso-8859-1,gb2312 。

3)Accept-Encoding:指定客户端可接受的数据压缩格式。

4)Accept-Language:客户端的语言环境。

5)Host:指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

6)If-Modified-Since:客户端告诉服务器资源的缓存时间。

7)Referer:客户端从哪个资源访问的服务端(防盗链)。

8)User-Agent:客户端的软件环境(什么操作系统,什么浏览器)。

9)Cookie:Cookie数据。

10)Connection:这个请求完了是保持链接还是断开链接。close/keep-alive

[html]  view plain  copy
  1. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8  
  2. Accept-Encoding:gzip,deflate,sdch  
  3. Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4  
  4. Cache-Control:max-age=0  
  5. Connection:keep-alive  
  6. Cookie:BAIDUPSID=3ACB0BC3ABB37A16450EACDE2D28DD15H_PS_BABANNER=3bid_1=ced932bb534ebe3b9378f2291bbae455B64_BOT=1BDUSS=XFjWFpmMFc1U2F-OFVmbDV3enpYNlpQMUNDTXN5aGUxQ2MxUjZuZURYOXhVNmxVQVFBQUFBJCQAAAAAAAAAAAEAAAAI2jMQzrS5-zE5NDMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHGgVRxxoFUM; cflag=65535%3A2; BAIDUID=211E07B07BF9E5775FC9E5E17E032741:FG=1BD_HOME=1H_PS_PSSID=10104_9505_10162_1455_9181_7801_9452_10442_10120_10209_10017_9499_10051_10459_10066_9770_10463_10355_9093_10096_10007_10460_9978_9023BD_UPN=12314353  
  7. Host:www.baidu.com  
  8. User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36  


三、HTTP响应:

(一)一个HTPP响应代表服务器向客户端回送的数据。

(二)内容:

1、包括:一个状态行,若干响应头(消息头),以及实体内容

2、实例



3、状态行:服务器处理的结果,主要是状态码数据。

1)格式:HTTP版本号 状态码 原因叙述<CRLF>,如 HTTP/1.1 200 OK

2)状态码:


①、301、302:资源已经不存在了,需要重定向到新地址。

②、304、307:指定客户端去拿缓存。

③、401、403:没有权限访问,如用户名密码错误。

④、404、407:请求的资源没有,如URL地址错误。

⑤、405:访问方式错误。如Get、Post方式错误。

⑥、500:服务器端出现问题。


4、消息头。

1)Location:配合301、302状态码使用,实现重定向。

[java]  view plain  copy
  1. response.setStates("301");//设置状态码为301  
  2. response.setHeader("Location","http://www.baidu.com")// 新网址  

2)server:服务器类型

3)Content-Encoding:压缩类型;实现压缩返回:

[java]  view plain  copy
  1. //实现压缩  
  2. String tDate = "准备被压缩的数据";  
  3. System.out.println("压缩前的数据大小:  "+tDate.getBytes().length);  
  4.   
  5. ByteArrayOutputStream bout = new ByteArrayOutputStream();  
  6. GZIPOutputStream gout = new GZIPOutputStream(bout);  
  7. gout.write(tDate.getBytes());  
  8. gout.flush();  
  9. gout.close();//写到字节数组流中  
  10.   
  11. byte[] gzip = bout.toByteArray();//得到压缩后的数据  
  12. System.out.println("压缩后的数据大小:  "+gzip.length);  
  13.   
  14. // 通知浏览器数据采用压缩格式  
  15. response.setHeader("Content-Encoding""gzip");//压缩格式  
  16. response.setHeader("Content-Length",gzip.length+"" );//压缩数据的长度  
  17. response.getOutputStream().write(gzip);  


4)Content-Length:返回内容的长度。

5)Content-Language:返回内容的语言。

6)Content-type:返回数据的类型。

[java]  view plain  copy
  1. //输出图片,可以去tomcat的web.xml中查找  
  2.         response.setContentType("image/bmp; charset=utf-8");  
  3. response.setHeader("Content-Type""image/bmp");  
  4. InputStream in = this.getServletContext().getResourceAsStream("/");  
  5. int len = 0;  
  6. byte[] buffer = new byte[1024];  
  7. OutputStream out = response.getOutputStream();  
  8. while((len=in.read(buffer))>0){  
  9.     out.write(buffer, 0, len);  
  10. }  

7)Refresh:浏览器多长时间重新刷新一次。也可以实现重定向。

[java]  view plain  copy
  1. response.setHeader("Refresh","1000");//刷新  
  2. response.setHeader("Refresh","1000; url=http://www.baidu.com");//刷新  
  3. response.setHeader("Refresh","0; url=http://www.baidu.com");//重定向  



8) Transfer-Encoding:数据的传送格式。 chunked-为以块状形式传送。

[java]  view plain  copy
  1. Transfer-Encoding   chunked  

9)Last-Modified:告诉浏览器当前资源的缓存时间。

10)ETag:缓存相关的头,可以实现实时更新,比其他缓存头(以秒为单位)更及时精确。

11)Expires:告诉浏览器把回送的资源缓存多长时间。-1或0,则不缓存。

[java]  view plain  copy
  1. //设置缓存 一定要是当前时间 + 控制的缓存时间  
  2. response.setDateHeader("Expires", System.currentTimeMillis() + 1000*3600);  

12)progma:"no-cache" | Cache-Control:"no-cache" :控制浏览器不要缓存。

[java]  view plain  copy
  1. //不需要缓存       
  2. response.setHeader("progma""no-cache");  
  3.         response.setHeader("Cache-Control""no-cache");  
  4.         response.setHeader("Cache-Control""no-store");  
  5.         response.setDateHeader("Expires"0);//时间头  


13)content-disposition:服务器返回内容为需要下载访问。

[java]  view plain  copy
  1. response.setHeader("content-disposition""attachment;filename=" + URLEncoder.encode("文件名称""UTF-8"));  


四、Range,实现断点下载

(一)在请求头字段

1、指示服务器只传输一部分web资源。这个头可以用来实现断点续传功能。

2、Range字段可以通过三种格式设置要传输的字节范围:

1)Range:bytes = 1000-2000 :传输范围从1000 到 2000 字节。
2) Range:bytes = 1000- :传输web资源中第1000个字节以后的所有内容。

3)Range:bytes = 1000 :传输最后1000 个字节。


3、代码实现:

[java]  view plain  copy
  1. //请求中,实现断电下载  
  2. URL url = new URL("http://localhost:8080/javaweb/");//请求的地址  
  3. HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  4. conn.setRequestProperty("Range""byte=5-");//请求5字节以后的数据,断点下载  
  5.   
  6. InputStream  in = conn.getInputStream();  
  7. int len = 0;  
  8. byte[] buffer = new byte[1024];  
  9. FileOutputStream out = new FileOutputStream("c:\\a.text",true);//存放的地方  
  10.   
  11. while((len=in.read(buffer))>0){  
  12.     out.write(buffer, 0, len);  
  13. }  
  14.   
  15. in.close();  
  16. out.close();  


(二)、在响应头字段

1、Accept-Range:这个字段说明web服务器是否支持Range。 支持,则返回Accept-Range:bytes; 如果不支持,则返回 Accept-Range:none。

2、Content-Range:指定了返回web 资源的字节范围。这个字段值的格式是:

[java]  view plain  copy
  1. //例子  
  2. Content-Range: 1000-3000/5000//整个资源是5000,返回的是1000-3000  



猜你喜欢

转载自blog.csdn.net/zjttlance/article/details/79923072