HTTP协议

原文链接:http://www.cnblogs.com/EvanLiu/p/3690216.html

HTTP协议简介

1.WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。

2.HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于描述客户端与服务器间的数据传递。

3.HTTP的版本有1.0和1.1

1.0的特点:每次请求服务器上的资源都要建立新的连接,响应完毕后会关闭连接,是无状态的协议。

1.1的特点:在一次TCP/IP连接的基础上可以发出多次请求和得到多次的响应。比1.0多了一些请求和响应头。

HTTP协议的组成部分

1.请求部分

GET /App1/1.html HTTP/1.1

Accept: */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET                CLR 3.0.4506.2152; .NET CLR 3.5.30729)

Host: localhost:8080

Connection: Keep-Alive

                                    

username=admin&password=123

请求部分由三个部分组成:

请求行:位于第一行

请求消息头:从第二行开始至第一个空行结束

请求正文:从第一个空行之后的都是正文

2.响应部分

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Accept-Ranges: bytes

ETag: W/"65-1366335797484"

Last-Modified: Fri, 19 Apr 2013 01:43:17 GMT

Content-Type: text/html

Content-Length: 65

Date: Fri, 19 Apr 2013 02:06:23 GMT

 

hello http

<a href="b.html">click</a>

<img src="1.jpg"/>

响应部分由三部分组成的:

响应行:位于第一行

响应消息头:从第二行开始至第一个空行结束

响应正文:从第一个空行之后的都是正文

HTTP协议详解

1.请求行:GET /App1/1.html HTTP/1.1

GET:请求方式。默认的请求方式。其他常用的请求方式还有POST。

         GET的特点:默认的请求方式。

                                     /App1/c.html?username=sdsfds&password=234324

                                     把表单的请求的数据放在了请求的URI的后面。

                                     缺点:暴露数据、请求行长度有限。

         POST的特点:借助HTML中的form表单。

                                     请求参数出现在正文部分。长度没有限制,相对安全。

/App1/1.html:请求的资源的URI

HTTP/1.1:客户端使用的协议的版本

2.响应行:HTTP/1.1 200 OK

HTTP/1.1:服务器使用的版本协议

200:响应码。代表服务器处理的结果的一种表示

         200:正常

         302/307:重定向

         304:服务器的资源没有被修改

         404:请求的资源不存在

         500:服务器出错了

OK:响应码描述

3.请求消息头:向服务器传递附加信息

Accept:通知服务器,浏览器可以接受的MIME类型。

Accept-Charset:通知服务器,浏览器支持的字符集

Accept-Encoding:通知服务器,浏览器能够解码的数据压缩方式。比如:gzip

Accept-language:通知服务器,所希望的语言

Host:请求的主机和端口

Referer:是一个URL地址。取值是当前页面之前的那个页面的地址。防盗链

Content-Type:通知服务器,请求正文的MIME类型。

If-Modified-Since:通知服务器,缓存的文件的最后修改时间。

User-Agent:通知服务器,浏览器类型

Content-Length:表示请求消息正文的长度。

Connection:表示是否需要持久连接。

 

4.响应消息头

Location:通知客户端,指示新的资源的位置(结合302/307来用。请求重定向)

eg:

package cn.lsl.http.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setStatus(302);    //设置响应码
        response.setHeader("Location", "/Http/index.jsp");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }
}

Server:通知客户端,服务器的类型

Content-Encoding:通知客户端,响应正文的压缩编码方式。常用的gzip。

package cn.lsl.http.servlet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String  data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte b[] = data.getBytes();
        System.out.println("原始数据的大小:"+b.length);
        //GZIP压缩
        //带有缓存的字节内存输出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();                              
     GZIPOutputStream gout = new GZIPOutputStream(out); gout.write(b); gout.close(); b = out.toByteArray(); System.out.println("压缩后的数据大小:"+b.length); response.setHeader("Content-Encoding", "gzip");//通知客户端数据的压缩编码 response.setHeader("Content-Length", b.length+""); response.getOutputStream().write(b);//输出相应正文 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }

HTTP协议

Content-Length:通知客户端响应正文的数据大小。

Content-Type:通知客户端响应正文的MIME类型

Refresh:让浏览器自动刷新。取值为正数(刷新的时间间隔,单位是秒)

                   Refresh:3

                   Refresh:3;URL=其他资源的URI

eg:

package cn.lsl.http.servlet;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo3 extends HttpServlet {
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Random r = new Random();
        String data = r.nextInt()+"";
        //response.setHeader("Refresh", "1");//间隔1秒刷新到自己
        response.setHeader("Refresh", "3;URL=/Http/index.jsp");//3秒后刷新到其他资源
        response.getOutputStream().write(data.getBytes());
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }

}

Content-Disposition:通知客户端,以下载的方式打开资源。

package cn.lsl.http.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filePath = getServletContext().getRealPath("/1.jpg");
        //通知客户端以下载的方式打开
        response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
        response.setHeader("Content-Type", "application/octet-stream");
        InputStream in = new FileInputStream(filePath);
        OutputStream out = response.getOutputStream();
        int len = -1;
        byte b[] = new byte[1024];
        while((len=in.read(b))!=-1){
            out.write(b, 0, len);
        }
        in.close();
        out.close();
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }
}

以下三个一起用,通知客户端不要缓存

Expires:-1                   网页的有效时间。单位是毫秒

Cache-Control:no-cache

Pragma:no-cache

eg:

package cn.lsl.http.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "aaaaaaaaaaaaaaaaaaa";
        response.setHeader("Expires", "-1");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        response.getOutputStream().write(data.getBytes());
    }

    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }

}

 

转载于:https://www.cnblogs.com/EvanLiu/p/3690216.html

上一篇:利用Filter解决Post请求中文乱码


下一篇:Servlet体系结构