Web开发之HTTP协议

HTTP响应消息


  • 一个HTTP响应代表服务器向客户端回送的数据。
  • 一个完整的HTTP响应包括如下内容:

一个状态行、若干消息头、以及响应正文,其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开。

例如:

HTTP/1.1 200 OK    //状态行
Server: Microsoft-IIS/5.0    //消息头,以下都是
Date: Thu, 13 Jul 2000 05:46:53 GMT
Content-Length: 2291
Content-Type: text/html
Cache-control: private    //消息头,以上都是
                        //空格隔开
<HTML>             //实体内容
<BODY>
……
  • 状态行:用于描述服务器对请求的处理结果
  • 消息头:用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据
  • 实体内容:代表服务器向客户端回送的数据

HTTP响应的细节——常用状态码

  • 200(正常)
    表示一切正常,返回的是正常请求结果
  • 302/307(临时重定向)
    指出被请求的文档已被临时移动到别处,此文档的新的URL在Location响应头中给出。
  • 304(未修改)
    表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求。
  • 404(找不到)
    服务器上不存在客户机所请求的资源。
  • 500(服务器内部错误)
    服务器端的程序发生错误

HTTP协议

规定了客户端和服务端交流时的数据格式

特点

请求和响应都由三部分组成

请求信息

  • 请求行
    • 请求的方式
    • 请求的资源地址
    • 请求协议
  • 请求头部分
    • 头名称
    • 头值
  • 请求正文
    • 只有请求的类型是post才会有

响应信息

  • 响应行
    • 响应协议
    • 状态码
    • 状态信息
  • 响应头信息
    • 响应头
    • 头值
  • 响应正文

post和get的区别

  • get方式请求参数会附加在url后,而post是看不到的,post相对安全
  • get方式对提交的数据大小有限制(1k),post方式对数据大小没有限制

请求头信息(主要)

  • Accept: 浏览器告诉服务端, 浏览器可接受的MIME类型

    MIME类型: 相当于操作系统下的文件类型。
    由大类型和小类型组成: text/html;
    对应的关系在conf/web.xml中查询

  • Referer: 浏览器告诉服务端,当前页面从哪里来的。

    用处: 1. 用来记录广告的信息 2. 防盗链

响应头信息

  • Location (重定向): 服务端用来告诉浏览器,请求需要重定向.(必须结合状态吗302使用)

    response.setStatus(302);
    //设置响应头
    response.setHeader(“Location”,”servlet/ServletDemo2.java”);

  • Content-Encoding: 服务端用来告诉浏览器,服务器对数据采用的编码

    String s = “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”;
    byte[] bs = s.getBytes();
    System.out.println(“压缩前的长度:” + bs.length);
    //创建一个字节数组输出流
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    //希望用Gzip压缩一下,然后发送
    //创建一个压缩流,包装了一下输出流
    GZIPOutputStream gzip = new GZIPOutputStream(baos);
    //将数据进行压缩
    gzip.write(bs);
    gzip.close();

    //从压缩流中拿出数据
    bs = baos.toByteArray(); //压缩后的数据
    System.out.println(“压缩后的长度:” + bs.length);

    //通知浏览器发送的数据是gzip
    response.setHeader(“Content-Enconding”, “gzip”);
    response.getOutputStream().write(bs);

  • Content-Type: 服务端用来告诉浏览器,你要用哪个码表来解析二进制数据

    String s = “末日没有进行曲”;

    //通知浏览器的Content-Type(告诉让其这个编码解析,以及发送这个编码的内容)
    response.setHeader(“Content-Type”, “text/html;charset=UTF-8”);
    response.getWrite.write(s);

  • Last-Modified : 服务端用来告诉浏览器,访问资源的最后修改时间

  • Refresh:服务端用来告诉浏览器,多长时间刷新一次

    //隔2s时间刷新自己
    response.setHeader(“Refresh”, “2”);
    response.getWrite.write(“number-” + new Random().netInt);

    //隔2s时间刷新到其他资源
    response.setHeader(“Refresh”, “2;url=/servlet/ServletDemo2”);

  • Content-Disposition: 服务端用来告诉浏览器,以下载文件的方式打开文件

    //拿到图片路径
    String path = this.getServletContext().getRealPath(“/WEB-INF/classes/1.gif”);

    //创建一个输入流对象
    FileInputStream is = new FileInputStream(path);
    byte[] bs = new byte[1024];
    int b = 0;

    //创建一个输出流对象
    ServletOutputStream os = response.getOutputStream();

    //通知浏览器不要直接显示,而要下载
    response.setHeader(“Content-Disposition”, “attachment;filename=1.gif”);

    //读取数据发送数据
    while((b = is.read(bs) != -1){
    os.write(bs,0,b);
    }
    is.close();
    os.close();

  • Expires: -1 : 服务端用来告诉浏览器,不要缓存

    //通知浏览器不要缓存
    response.setHeader(“Expires”, “-1”);
    response.setHeader(“Cache-control”, “no-cache”);
    response.setHeader(“Pragma”, “no-cache”);

    response.getWriter().write(“Hello world!”);

posted @ 2015-12-22 20:40  末日没有进行曲  阅读(86)  评论(0编辑  收藏  举报