Http协议详解

HTTP协议的主要特点可概括如下:

1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http协议的再介绍

①       http协议是建立在tcp/ip协议基础上

②       http协议全称 超文本传输协议

③       http协议1.0 , 1.1版本 ,目前通用的是1.1版本

http1.0 称为短连接

http1.1 称为长连接.

所谓长,和短指的是  持续时间的 长连接 1.1 30s ,短连接是发送完数据就断掉.

Http详解之请求篇

http请求由三部分组成,分别是:请求行、消息报头、请求正文

基本结构:

GET /test/hello.html HTTP/1.1 [请求行]

1)      Accept: text/html,image/*  [告诉服务器,我可以接受文本,网页,图片]

2.      Accept-Charset: ISO-8859-1 [接受字符编码 iso-8859-1]

3.      Accept-Encoding: gzip,compress [可以接受 gzip,compress压缩后数据.]

4.      Accept-Language: en-us,zh-cn [浏览器支持中,英文]

5.      Host: www.sohu.com:80 [我要找主机是www.sohu.com:80]

6.      If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT [ 告诉服务器,我的缓冲中有这个资源文件,该文件的时间是。。。]

7.      Referer: http://www.sohu.com/index.jsp [告诉服务器,我来自哪里,该消息头,常用于防止盗链]

8.      User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)[告诉服务器,浏览器内核]

9.      Cookie [cookie??]

10.  Connection:close/Keep-Alive   [保持连接,发完数据后,我不关闭连接]

11.   Date: Tue, 11 Jul 2000 18:23:51 GMT [浏览器发送该http请求的时间]

特别说明: 并不是每一次请求的消息头都一样.]

空行

发送的内容 [格式 : 内容名字=内容体]

请求方式

请求行中的GET称之为请求方式,请求方式有:POST,GET,HEAD,OPTIONS,DELETE,TRACE,PUT

常用的有:POST,GET

请求方法(所有方法全为大写)有多种,各个方法的解释如下:

GET       请求获取Request-URI所标识的资源。

POST       在Request-URI所标识的资源后附加新的数据。

HEAD       请求获取由Request-URI所标识的资源的响应消息报头。

PUT       请求服务器存储一个资源,并用Request-URI作为其标识。

DELETE       请求服务器删除Request-URI所标识的资源。

TRACE       请求服务器回送收到的请求信息,主要用于测试或诊断。

CONNECT       保留将来使用。

OPTIONS       请求查询服务器的性能,或者查询与资源相关的选项和需求。

HTTP协议详解之响应篇

在接收和解释请求消息后,服务器返回一个HTTP响应消息。

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文

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

举例:HTTP/1.1 200 OK

状态码 含义

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

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

300-399             为完成请求,客户需要进行一步细化请求。例如:请求的资源已经移动一个新的地址,常用302,307

400-499         客户端的请求有错误404

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

http响应的状态行举例说明:

200 就是整个请求和响应过程没有发生错误,这个最常见.

302: 表示当你请求一个资源的时候,服务器返回302 表示,让浏览器转向到另外一个资源,比如: response.sendRedirect(“/web应用/资源名”)

response.setStatus(302);

response.setHeader(“Location”, “/servletPro/Servlet2”);

// 上面两句话等价 response.sendRedirect(“/servletPro/Servlet2”);

404: 找不到资源

500: 服务器端错误

 

http响应消息头详解

Location: http://www.baidu.org/index.jsp 【让浏览器重新定位到url】

Server:apache tomcat 【告诉浏览器我是tomcat】

Content-Encoding: gzip 【告诉浏览器我使用 gzip】

Content-Length: 80  【告诉浏览器会送的数据大小80节】

Content-Language: zh-cn 【支持中文】

Content-Type: text/html;charset=GB2312 [内容格式text/html; 编码gab2312]

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 【告诉浏览器,该资源上次更新时间】

Refresh: 1;url=http://www.baidu.com 【过多久去,刷新到 http://www.baidu.com】

Content-Disposition: attachment; filename=aaa.zip 【告诉浏览器,有文件下载】

Transfer-Encoding: chunked  [传输的编码]

Set-Cookie:SS=Q0=5Lb_nQ; path=/search[后面详讲]

Expires: -1[告诉浏览器如何缓存页面IE]

Cache-Control: no-cache  [告诉浏览器如何缓存页面火狐]

Pragma: no-cache   [告诉浏览器如何缓存页面]

Connection: close/Keep-Alive  [保持连接 1.1是Keep-Alive]

Date: Tue, 11 Jul 2000 18:23:51 GMT

①定时刷新Refresh使用

response.setHeader(“Refresh”,”5;url=/servletPro/Servlet2″);

②文件下载Content-Disposition

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
publicvoid doGet(HttpServletRequest request, HttpServletResponseresponse)

           throwsServletException, IOException {

       response.setContentType("text/html");

       //PrintWriterout = response.getWriter();      

       //演示下载文件

       response.setHeader("Content-Disposition", "attachment; filename=winter.jpg");


       //打开文件.说明一下web 站点下载文件的原理

       //1.获取到要下载文件的全路径

       String path=this.getServletContext().getRealPath("/images/Winter.jpg");

       //System.out.println("path="+path);

       //2创建文件输入流

       FileInputStream fis=new FileInputStream(path);

       //做一个缓冲字节数组

       byte buff[]=newbyte[1024];

       int len=0;//表示实际每次读取了多个个字节

       OutputStreamos=response.getOutputStream();

       while((len=fis.read(buff))>0){

           os.write(buff, 0, len);

       }

       //缺点: 没有进度条./图标/

       //关闭

       os.close();

       fis.close();

    }

③缓存讲解

提出问题:浏览器默认情况下,会缓存我们的页面,这样出现一个问题:如果我们的用户习惯把光标停留在地址栏,然后回车来取页面,就会默认调用cache中取数据。

(1)      有些网站要求及时性很高,因此要求我们不缓存页面

代码:

//指定该页面不缓存 Ie

response.setDateHeader(“Expires”, -1);【针对IE浏览器设置不缓存】

//为了保证兼容性.

response.setHeader(“Cache-Control”, “no-cache”);【针对火狐浏览器等】

response.setHeader(“Pragma”, “no-cache”);【其他浏览器】

(2)       有些网站要求网页缓存一定时间,比如缓存一个小时

response.setDateHeader(“Expires”, System.currentTimeMillis()+3600*1000*24);后面一个参数表示设置的缓存保持时间,-1表示永远缓存。

HttpServletResponse的再说明:

getWriter()

getOutputStream();

区别

1.      getWriter() 用于向客户机回送字符数据

2.      getOutputStream() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)

OutputStream os=response.getOutputStream();

os.write(“hello,world”.getBytes());

如何选择:

如果我们是回送字符数据,则使用  PrintWriter对象 ,效率高

如果我们是回送字节数据(binarydate) ,则只能使用 OutputStream

☞ 这两个流不能同时使用.

比如:

1
2
3
4
5
6
7
8
9
10
11
 OutputStream os=response.getOutputStream();

       os.write("hello,world".getBytes());

       PrintWriter out=response.getWriter();

       out.println("abc");

就会报错:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

 

不能同时使用printWriter和outputstream的原因

Web服务器会自动检查并关闭流
使用outputstream的write后就会把信息封装到response对象,返回给web服务。然后web服务器就会去检测response的相关流有没有关闭,没有关闭就会自动关闭。所以再去使用response时就会报这个流已经被关闭的错误。

从该图,我们也可以看出. 为什么我们没有主动关闭流,程序也没有问题的原因.

当然:你主动关闭流,更好.

参数的传递方式sendRedirect()和session()

需求: 当用户登录成功后,把该用户名字显示在登录成功页面;

①使用sendRedirect()来传递字符参数

解决思路:

1.      使用java基础 static

2.      使用sendRedirect()

代码:

response.sendRedirect(“/UsersManager/MainFrame?uname=”+username+”&pwd=”+password);

3.      使用session 传递[后面讲]

这里,我们先预热.

说明:

基本格式:

response.sendRedirect(“servlet的地址?参数名=参数值&参数名=参数值…”);

☞ 参照值是String , 参数名应当使用 字母组合

在接受数据的Servlet中:

String 参数=request.getParameter(“参数名”);

②使用session()来传递字符参数和对象

A.传递字符串

放入session   request.getSession.setAttribute(“loginUser”,username);

取出session   在JSP中通过session取出request.getSession.getAttribute(“loginUser”);

B.传递对象

User user= new User();

user.setName(“xiaoli”);

user.setPassWord(“123”);

放入session   request.getSession.setAttribute(“userObj”,userObj);

取出session   User user=(User)request.getSession.getAttribute(“userObj”);

 

除非注明,Coder文章均为原创,转载请以链接形式标明本文地址

本文地址:http://www.alonemonkey.com/http-xy.html

本文链接:http://www.alonemonkey.com/http-xy.html