• HTTP协议


    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); } }

    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);
        }
    
    }
  • 相关阅读:
    hdoj Last non-zero Digit in N! 【数论】
    spin_lock &amp; mutex_lock的差别?
    20140514,微软5月14日公布8个安全补丁
    教你用笔记本破解无线路由器password
    SSL工作原理
    MS-SQLSERVER中的MSDTC不可用解决方法
    grub2手动引导ubuntu
    用递归翻转一个栈 Reverse a stack using recursion
    腾讯面试
    AngularJS移动开发中的坑汇总
  • 原文地址:https://www.cnblogs.com/EvanLiu/p/3690216.html
Copyright © 2020-2023  润新知