简介:

HTTP是hypertexttransfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。HTTP协议的版本:HTTP/1.0、HTTP/1.1
 
HTTP/1.0和HTTP/1.1的区别
HTTP1.0协议:客户端与web服务器建立连接后,只能获得一个web资源,在获取资源之后就断开连接。
HTTP1.1协议:允许客户端与web服务器建立连接后,在一个连接上获取多个web资源都不会断开连接,除非是访问出错和手动断开连接。
 
下面使用telnet命令来举例说明:
首先启动telnet来连接上tomcat服务器,然后输入请求内容获取资源:
这里可能会出现一些问题:详情请见:http://www.oschina.net/question/234345_53824
同时我们还需要在tomcat的webapp目录中新建一个aa工程,在该工程中新建一个index.html文件,文件中输入点内容。
连接上tomcat服务器之后,输入命令:GET  /aa/index.html  HTTP/1.0
 
 
从上图可以查看在使用HTTP/1.0的时候,访问到了数据之后就断开了连接。
 
下面再来使用HTTP/1.1测试一下:输入命令:GET  /aa/index.html  HTTP/1.1
 
 
当获取玩数据之后并没有断开连接,还可以继续输入命令进行请求。
 
通过上面的例子看以看到HTTP/1.0和HTTP/1.1的区别了。
 
下面再来看一下一个简单的web页面中每个资源标签都会发送一次请求,这里我们来验证的话需要辅助工具了:HttpWatch Pro工具,这就是一个web抓包工具,可以监测http请求的。安装很简单的。我们这里使用IE浏览器测试:http://localhost:8080/aa/index.html:
 
 
我们看到只有一次Get请求。下面我们在/aa/index.html文件中添加内容:
 
  1. <img src="1.jpg"/>
  2. <img src="2.jpg"/>
  3. <img src="3.jpg"/>
 

这是使用了三个图片标签,我们再次访问:http://localhost:8080/aa/index.html

 

我们可以看到发生了四次请求,其中有三次是来请求图片资源的。
同理:脚本标签也是一样,所以像一些资源标签会发生一次请求的,所以我们在设计网站的时候为了网页的访问性能,我可能会将多个资源整合起来,比如:三张图片可能整合到一张,三个脚本文件可能整合到一个文件中。这些举措都是为了访问性能。当然这种情况肯定是视情况而定的。
 

HTTP的请求内容

一个完整的HTTP请求包含:

1.一个请求行(GET  /aa/index.html  HTTP/1.0)

2.若干个请求头(告诉服务器客户端的一些信息)

3.实体内容(请求的时候需要向服务器传递的内容)。

注意:请求行,请求头,然后后空一行,请求信息(如表单提交数据为post方式)。

请求行:用于描述客户端的请求方式,请求的资源名称,以及使用的HTTP的协议版本号

GET  /aa/index.html  HTTP/1.0

请求头:

告诉服务器一些客户端的信息

Accept:用于告诉服务器,客户机支持的数据类型(值为:text/html(文本),image(图片),/*/(任何类型)

Accept-Charset:客户机采用的编码

Accept-Encoding:客户机支持的压缩格式

Accept-Language:客户机的语言环境,不同国家访问的内容也是不同的,就是通过这个头实现的,用于实现国际化

Host:告诉服务器,想访问的主机名

If-Modified-Since:客户机将这个头信息发送给服务端,服务端进行比对,告诉客户机是否去拿缓存,和服务器端返回的Last-Modified值是相等的

If-None-Match:客户机将这个头信息发送给服务端,服务端进行比对,告诉客户机是否去拿缓存,和服务器端返回的Etag值是相等的

Referer:客户机告诉服务器,他是从哪个资源来访问服务器的(防盗链),通过检查该头是否是从本网站点击过来的,如不是的,就让他跳到本网站的首页来

User-Agen::客户机告诉服务器,客户机的软件环境

Cookie:客户机通过这个头向服务器带点数据

Connection:客户机的连接状态(close:关闭连接  Keep-Alive:不会断开连接)

例子:

这个是我在访问http://localhost:8080/aa/index.html,可以看到请求信息。

以上的内容为多个消息头,用于描述客户端请求哪台主机,以及客户端的一些环境信息等

请求行中的GET称之为请求方式,请求方式:post,get,head,options,delete,trace,put,常用的有:get,post,用户没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点击链接访问都是get,用户如想把请求方式改为post,可通过更改表单form的提交方式实现.不管post或get,都用于向服务器请求某个web资源,这两种方式的区别主要表现在数据传递上:请求方式为get方式,则可以再请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分割,同时在URL地址后附带的参数是有限制的,其数据容量通常不能超过1k,若请求方式为post方式,则可以再请求的实体内容中向服务器发送数据,post方式的特点:传送的数据无限制.

  1. <a href="/2.html?name=jiangwei">2.html</a>

点击这个链接就是一个get方式,而且携带了name字段值

点击链接是Get方式,而且是在资源地址后面携带信息的。

同时再看一下Referer这个请求头,这个头代表的是从当前页面是从哪个页面跳转过来的:

我们点击上面的2.html超链接,跳转到了2.html页面这时候可以看到请求头中的Referer:http://localhost:8080/aa/index.html,表明2.html页面是从index.html页面跳转过来的,这个请求头的作用还是很大的,主要用于防盗链,比如用户点击了一个链接跳转到一个页面中,该页面的网站站长发现这个用户不是从指定的页面中跳转过来的,所以就会让页面跳转到该网站的首页,让用户从该网站的首页跳转到该页面。

下面在/aa/index.html文件中添加一个表单:

  1. <form action="/2.html" method="post">
  2. <input type="text" name="name"/>
  3. <input type="submit"/>
  4. </form>

在文本框中输入内容,点击提交按钮:

可以看到这种方式是post方式,而且在请求头之后空一行,是请求内容信息。

HTTP的响应内容

响应头:

用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会它会送的数据

Location:这个头配合302状态码使用,用于告诉用户找谁

  1. response.setStatus(302);
  2. response.setHeader("Location","/aa/1.html");

请求重定向,判断浏览器的地址栏的地址是否发生变化,实例是用户登录

Server:服务器通过这个头,告诉浏览器的类型

Content-Encoding:服务器通过这个头,数据的压缩格式,收费是靠数据出口量算的, 所以为了省钱和效率高,要进行数据压缩,jdk中的GZIPOutputStream类,压缩类流,包装流和底层流,最好将包装流关了或者刷新,数据写入到底层流中去,

  1. response.setHeader("Content-Encoding","gzip");
  2. response.setHeader("Content-length",gzip.length+"");

Content-Length:服务器会送的数据的长度

Content-Type:服务器会送数据的类型,response.getOutputStream().write();服务器会送数据都是二进制,通过这个头,可以告诉浏览器这个二进制是什么类型,

  1. InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
  2. int len = 0;
  3. byte buffer[] =new byte[1024];
  4. OutputStream out =response.getOutputStream();
  5. while((len=in.read(buffer))>0){
  6. out.write(buffer,0,len)
  7. }

在服务器的目录下的web.xml中查看各个数据类型的respose.setHeader("content-type","")的写法.

Refresh:告诉浏览器隔多长时间刷新一次,response.setHeader("refresh","3;url=""")控制浏览器隔三秒跳到指定的网页上

Content-Disposition:告诉浏览器以下载的方式打开文件

  1. response.setHeader("content-disposition","attachment;filename=1.jpg);

Transfer-Encoding:告诉浏览器数据的传送格式

Last-Modified:服务端文件的最后修改时间,这个值返回给客户端,客户机第二次访问服务器时带来的If-Modified-Since的值和服务器的值一样,就拿缓存给客户,实时更新,

ETag:缓存相关的头,服务器根据数据的内容生产一个字符串,客户机第二次访问服务器时带来的If-None-Match的值和服务器的值一样,就拿缓存给客户,实时更新,

Expires:高速浏览器,把会送的资源缓存多少时间,-1或0,则是不缓存的

Pragma:no-cache

Cache-Control:no-cache

Date:控制浏览器不要缓存数据,当数据不发生改变时,就要缓存,当实时性要求很高的数据不能缓存.

响应行:

HTTP /1.1 200 OK  :状态行,用于描述服务器对请求的处理结果

格式:HTTP版本号  状态码  原因叙述

状态码用于表示服务器对请求的处理结果,他是一个三位的十进制数,响应状态码分为5类,

100-199:表示接收请求,要求客户端继续提交下一次请求才能完成整个处理过程

200-299:表示成功接收请求并已完成整个处理过程,常用200

300-399:为完成请求,客户需进一步细化请求,例如,请求的资源已经移动一个新地址,常用302(你请求我,我叫你去找别人),307和304(拿缓存)

400-499:客户端的请求有错误,常用404,403(没有权限访问,之前我们在打开Tomcat Manager页面的时候遇到过)

500-599:服务器端出现错误,常用500

实体内容:

在响应头后面空一行是服务器返回的实体内容:

<HTML>

<BODY>

...........

 
下面我们来写一点服务端的代码,这样才能够明了的展示各个响应头的作用。下面就在MyEclipse中新建一个Web应用:
 
 
在工程中新建一个ServletDemo1.java来编写服务端的代码:代码如下:
  1. package com.http.demo;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.util.zip.GZIPOutputStream;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. public class HttpServletDemo extends HttpServlet {
  12. private static final long serialVersionUID = -7234797658264000867L;
  13. @Override
  14. protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
  15. //测试
  16. try{
  17. //test1(resp);//location响应头
  18. //test2(resp);//Content-Encoding响应头
  19. //test3(resp);//Content-Type响应头
  20. test4(resp);//refresh响应头
  21. //test5(resp);//content-disposition
  22. }catch(Exception e){
  23. e.printStackTrace();
  24. }
  25. }
  26. @Override
  27. protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
  28. doGet(req,resp);
  29. }
  30. //使用响应头location和302状态码实现请求重定向(地址栏中的地址发生改变)
  31. public void test1(HttpServletResponse response){
  32. response.setStatus(302);
  33. response.setHeader("Location", "/aa/3.html");
  34. }
  35. //使用响应头Content-Encoding实现数据的压缩输出
  36. public void test2(HttpServletResponse resp) throws Exception{
  37. //压缩数据很大的时候压缩效率才有体现,如果数据很小的话反而更大
  38. //压缩资源:提高网页的访问性能,电信按照出口流量收钱的。
  39. String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";//压缩数据大点还有效果
  40. System.out.println("压缩前的数据大小:"+data.length());
  41. ByteArrayOutputStream bout = new ByteArrayOutputStream();//底层流
  42. GZIPOutputStream gout = new GZIPOutputStream(bout);//包装流一般有缓冲,没有把缓冲区写满,不会写到底层流
  43. gout.write(data.getBytes());
  44. gout.close();//等于刷新操作,将包装流中的信息刷新
  45. byte gzip[] = bout.toByteArray();//得到压缩后的数据
  46. System.out.println("压缩后的数据大小:"+gzip.length);
  47. //通知浏览器数据采用压缩格式
  48. resp.setHeader("Content-Encoding", "gzip");
  49. resp.setHeader("Content-Length", gzip.length+"");//表明长度
  50. resp.getOutputStream().write(gzip);//压缩数据写给浏览器
  51. }
  52. //使用响应头content-type设置服务器返回给client的数据类型
  53. public void test3(HttpServletResponse resp) throws Exception{
  54. //具体可以查看tomcat目录中的web.xml文件
  55. resp.setHeader("Content-Type","image/jpeg");
  56. InputStream ins = this.getServletContext().getResourceAsStream("/1.jpg");
  57. int len = 0;
  58. byte[] buffer = new byte[1024];
  59. OutputStream ops = resp.getOutputStream();
  60. while((len = ins.read(buffer))!=-1){
  61. ops.write(buffer, 0, len);
  62. }
  63. ops.close();
  64. }
  65. //使用响应头refresh实现页面的定时刷新
  66. public void test4(HttpServletResponse resp) throws Exception{
  67. //股票,聊天室
  68. //填充的值为:3;url="http://www.baidu.com"表示3s之后跳转到http://www.baidu.com页面
  69. //如果没有http://www.baidu.com的话,只是在该页面进行刷新
  70. resp.setHeader("refresh", "3;url=\"http://www.baidu.com\"");
  71. String data = "aaaaaaaaaaaaaa";
  72. resp.getOutputStream().write(data.getBytes());
  73. }
  74. //使用响应头content-disposition实现客户机用下载的方式打开数据资源
  75. public void test5(HttpServletResponse resp) throws Exception{
  76. resp.setHeader("content-disposition","attachment;filename=1.jpg");
  77. InputStream ins = this.getServletContext().getResourceAsStream("/1.jpg");
  78. int len = 0;
  79. byte[] buffer = new byte[1024];
  80. OutputStream ops = resp.getOutputStream();
  81. while((len = ins.read(buffer))!=-1){
  82. ops.write(buffer, 0, len);
  83. }
  84. }
  85. }
 
启动Tomcat将应用部署好,在浏览器中输入:http://localhost:8080/HttpDemo/HttpServletDemo
 
第一:测试响应头字段:Location:重定向
测试test1()方法:
 
 
在test1()方法中我们指定了重定向的页面是/aa/3.html,而且重定向的一个最明显特征就是地址栏中的地址会发生改变,这个主要用在用户登录的时候,当用户登录成功之后要重定向到指定页面。
 
第二:测试响应头字段:Content-Encoding:实现压缩输出
测试test2()方法:
 
 
我们可以看到压缩输出了,指定的是gzip压缩输出。这里同时还要指定Content-Length头字段表示返回数据的长度。同时我们在MyEclipse中的控制台中可以看到:
 
压缩之前的数据大小和压缩之后的数据大小是4倍,这个效率很高的,这个压缩头字段的作用很大,对于大型的网站像新浪,搜狐这样的门户网站,他们的首页很复杂的,所以这里必须要做压缩输出:有两个原因:1.压缩数据之后返回给客户机很明显能够提高该页面的访问性能。2.能够减少费用(压缩数据少了,出口流量就少了,这样运营商收费就会减少)
 
第三:响应头字段:Content-type:告诉浏览器返回的数据类型
测试test3()方法:
 
 
我们将像客户机返回一张图片,指定类型是imag/jpeg即可,这里这个字段填写的格式我们可以参考tomcat目录中的web.xml文件中的所有类型的格式:
 
 
这里就列举了所有mime类型的书写格式。
 
第四:测试响应头:refresh:定时刷新
测试test4()方法:
因为又刷新的功能,这里不能截图了,自行演示。
这个头字段的作用用途很多的,比如股票页面那些数据是需要定时刷新的,还有网页聊天室,这里的聊天内容也是要定时刷新的。这样我们只需要设置这个头即可:
  1. resp.setHeader("refresh", "3");

每隔3s刷新该页面

如果我们希望页面隔多少秒之后跳转到指定页面:比如我们在网页中认证完之后,3s之后跳转到首页,只需要设置如下即可:
  1. resp.setHeader("refresh", "3;url=\"http://www.baidu.com\"");

这个就是说3s之后跳转到baidu首页。

 
第五:测试响应头:Content-disposition:告诉浏览器以下载的方式打开文件
测试test5()方法:
 
 
这里我们还是使用1.jpg这张图片,告诉浏览器已下载的方式打开图片。
 
总结:上面我们就介绍了HTTP的相关知识,关于HTTP的知识是很重要的,他是学习web的基石,所以我们一定要搞定这里面的所有知识,才能进行下一步的开发。

JavaWeb学习篇之----HTTP协议详解的更多相关文章

  1. JavaWeb学习篇之----容器Response详解

    今天在来看一下Response容器的相关知识,其实这篇blog早就应该编写了,只是最近有点忙,所以被中断了.下面我们就来看一下Response容器的相关知识吧.Response和我们即将在后面说到的R ...

  2. JavaWeb学习篇之----容器Request详解

    前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然R ...

  3. JavaWeb学习篇之----EL表达式详解

    我们之前的几篇文章中都提到了一个EL表达式,那么这个EL表达式到底是什么东东呢?为什么用处那么大,下面我们就来看看EL表达式的相关内容 EL表达式简介: EL 全名为Expression Langua ...

  4. JavaWeb学习----JSP内置对象详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. [转载]JavaEE学习篇之——JQuery技术详解

    原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/32102187 1.简介2.工具3.jQuery对象 1.DOM对象转化成j ...

  6. J2EE学习篇之--JQuery技术详解

    前面我们讲解了的J2EE的技术都是服务端的技术,下面我们来看一下前端的一些开发技术,这一篇我们来看一下jQuery技术 简介: jQuery由美国人John Resig创建,至今已吸引了来自世界各地的 ...

  7. J2EE学习篇之--Struts2技术详解

    前面说到了Struts1的相关知识,下面来说一下Struts2的相关知识,我们知道现在Struts2使用的比Struts1多,Struts2已经替代Struts1成为主流的框架了... 摘要 Stru ...

  8. J2EE学习篇之--Spring技术详解

    今天我们来看一下Spring的相关知识,我们知道Spring也是一个开源的框架,这个框架并不像是Struts一样,这个框架是可以用在Java的所有地方,所以,其实开发Android的时候我们也是可以使 ...

  9. TCP /IP协议详解【转】

    转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...

随机推荐

  1. Android WiFi管理(WIFI_SERVICE)

    Android WiFi管理(WIFI_SERVICE) 分类: Android2011-11-24 10:52 2000人阅读 评论(1) 收藏 举报 androidservicebuttonlay ...

  2. 修炼dp(1)

    从最简单的开始: POJ:The Triangle #include <cstdio> #include <algorithm> #include <cstring> ...

  3. 为什么无论你怎么设置自定义的外层div的高度,easyui的动态添加的tab的高度还是不变高

    由以下代码可知,easyui自动将panel的height设置为了固定的150px高度!

  4. /system改成可写

    读写: mount -o remount,rw /dev/block/mtdblock0 /system 只读mount -o remount,ro /dev/block/mtdblock0 /sys ...

  5. [iOS]C语言技术视频-10-指针变量

    下载地址: 链接: http://pan.baidu.com/s/1jGjbaXg 密码: u2t9

  6. ecos资源探测器

    两种类型的资源探测器 xml文件资源探测器 目录资源探测器 系统内置的资源探测器(核心) 数据库定义目录资源探测器 -base_application_datable 关注dbschema servi ...

  7. 全文搜索之 Elasticsearch

    概述 Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定.可靠.快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的. 特性 安装方便:没有其他依赖,下载 ...

  8. awk简单用法

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  9. (简单) POJ 1860 Currency Exchange,SPFA判圈。

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  10. Windwos下 php mysql apache 环境配置

    一.下载所需软件: 1.安装Windows组件: 安装Apache的前  必须安装  VC11 vcredist_x86.exe (64位请下载vcredist_x64.exe),选择时尽量选择英文版 ...