JavaWeb_HTTP协议

概述

什么是HTTP协议

客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。
使用telnet程序连上web服务器,并使用HTTP协议获取某个页面,快速了解 HTTP协议的作用。
  • telnet是windows自带的网络客户端软件,可以使用它连接互联网上任何一台服务器
  • 在dos中输入:telnet localhost 8080,然后在弹出的telnet窗口中输入GET /aa/1.html HTTP/1.1(get命令,访问页面,http协议版本),回车,输入主机名:Host:,因为localhost主机是缺省主机,这里可以不指定,两次回车,得到http响应
安装IE浏览器插件HttpWatch,查看IE浏览器通过HTTP协议获取某个页面。

HTTP协议简介

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议(工作在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举例说明。
  • 1.0:获取一个资源之后马上断开链接
  • 1.1:获取一个资源之后链接不断开,可以继续获取
一个好多同学搞不清楚的问题:
  • 一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求?
    • 4次请求:第一次请求浏览器拿到页面html数据,解析执行,imag标签控制浏览器打开服务器上的图片资源
    • Web页面设计的优化原则:减少客户机的http请求数,减轻服务器压力,比如把三个图片合成一个图片,把多个js文件代码写到一个js文件,多个CSS合并成一个CSS

HTTP请求

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。
一个完整的HTTP请求包括一个请求行、若干请求头、以及实体内容,如下所示 :
JavaWeb_HTTP协议_第1张图片

请求行

请求行中的GET称之为请求方式,请求方式有:
  • POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
  • 常用的有: GET、 POST
  • 用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现:
    method=“Post”>
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:
  • 如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyzHTTP/1.1
  • GET方式的特点:在URL地址后附带的参数是有限制的,并且附带的数据容量通常不能超过1K。
  • 如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。因为是在体中提交的
  • 用户名和密码不要用get方式提交
  • 用户在点超链接访问服务器时需要带一点数据,因为此时是get请求,所以可以在资源名称后用?带上该数据

消息头

用于HTTP请求中的常用头
  • Accept: text/html,image/* 客户机告诉服务器客户机支持的数据类型
    • */* 表示什么都支持
  • Accept-Charset: ISO-8859-1客户机告诉服务器客户机采用的编码
  • Accept-Encoding: gzip,compress 客户机告诉服务器客户机支持的数据压缩格式
  • Accept-Language: en-us,zh-cn  客户机的语言环境 zh-cn:中文下的中国(区别简繁体)
    • 应用在国际化中,比如不同国家访问google的服务器返回的页面语言不同
  • Host: www.it315.org:80 客户机告诉服务器想访问的主机名
  • If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 客户机告诉服务器资源的缓存时间
    • 服务器会将访问过的资源缓存,下一次访问资源时会带着缓存时间访问服务器,服务器会比对该网页的最后更新时间,如果资源没有更新,会通过浏览器直接拿缓存,如果更新了就发最新页面
  • Referer: http://www.it315.org/index.jsp 客户机告诉服务器它是从哪个资源来访问服务器的
    • 也就是点击的链接所在的网页资源。应用于防盗链:别处的网站的超链接指向自己的资源,相当于该资源被盗走了。那么该资源就不能通过静态页面,而是通过程序打出来给用户,在程序中判断用户HTTP请求中的Refer是不是以自己的网站开头的资源,如果是,就展示给用户,如果是盗用者,就跳到首页上去,让用户看广告
  • 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

HTTP响应

一个HTTP响应代表服务器向客户端回送的数据,它包括:一个状态行、若干消息头、以及实体内容 。 
JavaWeb_HTTP协议_第2张图片

状态行

格式: HTTP版本号  状态码 原因叙述
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
JavaWeb_HTTP协议_第3张图片

常用响应头

Location: http://www.it315.org/index.jsp  配合302状态码使用,告诉客户机找谁
  • 请求重定向。应用场景:用户登录,servlet查询用户名和密码之后重定向首页
Server:apache tomcat 告诉浏览器服务器的类型
Content-Encoding: gzip 服务器告诉浏览器数据的压缩格式
  • 数据压缩可以提高整个页面的访问性能,还可以省钱(因为节省流量)
  • 压缩数据输出代码:
    String data = "aaaaaaaaaaaaaaaaaaaa";
    		ByteArrayOutputStream bout = new ByteArrayOutputStream();//底层流
    		GZIPOutputStream gout = new GZIPOutputStream(bout);//包装流,GZIP是一个压缩算法
    		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);//将压缩数据写给浏览
Content-Length: 80  告诉浏览器回送数据的长度
Content-Language: zh-cn 
Content-Type: text/html; charset=GB2312  告诉浏览器回送数据的类型
  • 让浏览器以对应的方式打开数据
  • 在tomcat的conf->web.xml中查看文件类型对应的content-type的值
  • 通过content-type头字段控制浏览器以哪种方式处理数据
                    response.setHeader("content-type","image/jepg");
    		
    		InputStream in = this.getServletContext().getResourceAsStream("/2.jpg");
    		int len = 0;
    		byte[] buf = new byte[1024];
    		
    		OutputStream out = response.getOutputStream();
    		while((len=in.read(buf))>0){
    			out.write(buf,0,len);
    		}
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 告诉浏览器当前资源的最后缓存时间
Refresh: 1;url=http://www.it315.org 告诉浏览器隔多长时间刷新当前页面一次
  • 股票页面,聊天室
  • 也可以控制刷新到哪里:response.setHeader(“refresh”, “3;url=‘http//www.sina.com’”);应用于论坛注册完毕隔几秒钟将会…
Content-Disposition: attachment; filename=aaa.zip 告诉浏览器以下载方式打开浏览器
  • response.setHeader(“content-disposition”, “attachment;filename = 3.jpg”);
Transfer-Encoding: chunked  告诉浏览器数据的传送格式 chunked表示一块块传送
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Etag: 缓存相关的头 告诉浏览器是拿缓存还是拿服务器中的相关页面
  • 服务器会根据web资源的内容生成一个唯一的串,内容更改了,串也会更改。客户机第一次访问资源时,服务器会以E-tag方式将串回写给客户机,客户机下次再次访问时会带着etag标识来,服务器会检查资源的etag与客户机带来的etag是否一样,一样的话表示没有改动,直接让浏览器去拿缓存
  • 请求头的If-Modified-Since只能做到秒一级的控制,etag头可以做到实时更新
Expires: -1  服务器告诉浏览器把回送的资源缓存多长时间,-1或0是不缓存
Cache-Control: no-cache  也是不缓存
Pragma: no-cache   也是不缓存,要兼容市面上所有浏览器就将这三个头的值都设为不缓存
  • 实时性要求很高的数据不要缓存,比如股票数据
Connection: close/Keep-Alive   
Date: Tue, 11 Jul 2000 18:23:51 GMT

HTTP实用头字段

Http请求头字段

Range头指示服务器只传输一部分web资源。可以用来实现断点续传功能。Range字段可以通过三种格式设置要传输的字节范围:
Range: bytes=1000-2000
  • 传输范围从1000到2000字节
Range: bytes=1000-
  • 传输web资源中第1000个字节以后所有内容
Range: bytes=1000
  • 传输最后1000字节
当数据只下载了一部分就停止,需要继续访问服务器下载,需要自己写程序发送Range头至服务器实现断点下载。
	public static void main(String[] args) throws Exception {
		URL url = new URL("http://localhost:8080/day05/a.txt");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		
		conn.setRequestProperty("Range", "bytes=5-");
		
		InputStream in = conn.getInputStream();
		int len = 0;
		byte[] buf = new byte[1024];
		FileOutputStream out = new FileOutputStream("c:\\a.txt",true);
		while((len=in.read(buf))>0){
			out.write(buf, 0, len);
		}
		
		in.close();
		out.close();
	}

Http响应消息头字段

Accept-Ranges: 这个字段说明web服务器是否支持Range,支持则返回 Accept-Ranges: bytes, 不支持则返回Accept-Ranges: none。Tomcat5不支持
Content-Range:指定了返回的web资源的字节范围。这个字段的格式是: 例如Content-Range: 1000-3000/5000:返回1000-3000字节,整个资源是5000字节

作业

请写一篇关于HTTP协议的笔记,要求:
  • 描述清楚HTTP请求头、响应头的格式
  • 请求头和响应头中各个头字段的含义
如果浏览器传递给WEB服务器的参数内容超过1K,应该使用那种方式发送请求消息? 
请描述200、302、304、404和500等响应状态码所表示的意义。 
请列举三种禁止浏览器缓存的头字段,并写出相应的设置值。

你可能感兴趣的:(JavaWeb)