一、简介
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
- Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- Accept-Encoding:gzip,deflate,sdch
- Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4
- Cache-Control:max-age=0
- Connection:keep-alive
- Cookie:BAIDUPSID=3ACB0BC3ABB37A16450EACDE2D28DD15; H_PS_BABANNER=3; bid_1=ced932bb534ebe3b9378f2291bbae455; B64_BOT=1; BDUSS=XFjWFpmMFc1U2F-OFVmbDV3enpYNlpQMUNDTXN5aGUxQ2MxUjZuZURYOXhVNmxVQVFBQUFBJCQAAAAAAAAAAAEAAAAI2jMQzrS5-zE5NDMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHGgVRxxoFUM; cflag=65535%3A2; BAIDUID=211E07B07BF9E5775FC9E5E17E032741:FG=1; BD_HOME=1; H_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_9023; BD_UPN=12314353
- Host:www.baidu.com
- 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状态码使用,实现重定向。
- response.setStates("301");//设置状态码为301
- response.setHeader("Location","http://www.baidu.com")// 新网址
2)server:服务器类型
3)Content-Encoding:压缩类型;实现压缩返回:
- //实现压缩
- String tDate = "准备被压缩的数据";
- System.out.println("压缩前的数据大小: "+tDate.getBytes().length);
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- GZIPOutputStream gout = new GZIPOutputStream(bout);
- gout.write(tDate.getBytes());
- gout.flush();
- gout.close();//写到字节数组流中
- byte[] gzip = bout.toByteArray();//得到压缩后的数据
- System.out.println("压缩后的数据大小: "+gzip.length);
- // 通知浏览器数据采用压缩格式
- response.setHeader("Content-Encoding", "gzip");//压缩格式
- response.setHeader("Content-Length",gzip.length+"" );//压缩数据的长度
- response.getOutputStream().write(gzip);
4)Content-Length:返回内容的长度。
5)Content-Language:返回内容的语言。
6)Content-type:返回数据的类型。
- //输出图片,可以去tomcat的web.xml中查找
- response.setContentType("image/bmp; charset=utf-8");
- response.setHeader("Content-Type", "image/bmp");
- InputStream in = this.getServletContext().getResourceAsStream("/");
- int len = 0;
- byte[] buffer = new byte[1024];
- OutputStream out = response.getOutputStream();
- while((len=in.read(buffer))>0){
- out.write(buffer, 0, len);
- }
7)Refresh:浏览器多长时间重新刷新一次。也可以实现重定向。
- response.setHeader("Refresh","1000");//刷新
- response.setHeader("Refresh","1000; url=http://www.baidu.com");//刷新
- response.setHeader("Refresh","0; url=http://www.baidu.com");//重定向
- Transfer-Encoding chunked
9)Last-Modified:告诉浏览器当前资源的缓存时间。
10)ETag:缓存相关的头,可以实现实时更新,比其他缓存头(以秒为单位)更及时精确。
11)Expires:告诉浏览器把回送的资源缓存多长时间。-1或0,则不缓存。
- //设置缓存 一定要是当前时间 + 控制的缓存时间
- response.setDateHeader("Expires", System.currentTimeMillis() + 1000*3600);
12)progma:"no-cache" | Cache-Control:"no-cache" :控制浏览器不要缓存。
- //不需要缓存
- response.setHeader("progma", "no-cache");
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Cache-Control", "no-store");
- response.setDateHeader("Expires", 0);//时间头
13)content-disposition:服务器返回内容为需要下载访问。
- 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、代码实现:
- //请求中,实现断电下载
- URL url = new URL("http://localhost:8080/javaweb/");//请求的地址
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestProperty("Range", "byte=5-");//请求5字节以后的数据,断点下载
- InputStream in = conn.getInputStream();
- int len = 0;
- byte[] buffer = new byte[1024];
- FileOutputStream out = new FileOutputStream("c:\\a.text",true);//存放的地方
- while((len=in.read(buffer))>0){
- out.write(buffer, 0, len);
- }
- in.close();
- out.close();
(二)、在响应头字段
1、Accept-Range:这个字段说明web服务器是否支持Range。 支持,则返回Accept-Range:bytes; 如果不支持,则返回 Accept-Range:none。
2、Content-Range:指定了返回web 资源的字节范围。这个字段值的格式是:
- //例子
- Content-Range: 1000-3000/5000//整个资源是5000,返回的是1000-3000