• HTTP协议


    1 http协议

    1.1 概念

    是对浏览器和服务器端数据传输格式的规范!

    2 Http请求

    GET /day08/first HTTP/1.1    --请求行

    Host: localhost:8080        --请求头(以键值对形式出现)

    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Accept-Language: en-GB,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,en;q=0.2

    Accept-Encoding: gzip, deflate

    Connection: keep-alive

                                 --一个空行

    name=eric&password=123456    --- 实体内容

    2.1 请求行

    GET /program/first HTTP/1.1

    http协议版本:

    http1.0: 当浏览器和服务器连接之后,在一次连接中只能发出一个请求

    http1.1:当浏览器和服务器连接之后,在一次连接中可以发出多次请求。(效率比1.0更高)

    请求方式(提交方式):

    http协议中的请求方式:GET、POST、HEAD、PUT、CONNECT。。。。

    最常用的的请求方式: GET  和 POST

    <form action="提交的地址" method="get/post">

    </form>

    GET与POST对比

    2.2 请求头

    Accept:    --浏览器接受的数据类型

    Accept-Charset:     --浏览器接受数据编码格式

    Accept-Encoding:   --浏览器接受的数据压缩格式

    Accept-Language:       ---浏览器接受的语言  

    Host:        --请求发出的主机和端口(必须)

    If-Modified-Since:   --浏览器缓存的最后修改时间

    Referer:  -- 当前请求来自于哪里 (防止非法链接)

    User-Agent:   --浏览器的类型

    Cookie:            ---浏览器保存的cookie数据

    Connection:      ---浏览器和服务器的连接状态。close:关闭。keep-alive:保持连接

    Date:  --请求发出的时间

     使用HttpServletRequest获取请求信息

        HttpServletRequest对象:获取请求数据

         请求行:

         请求方式: request.getMethod()

         请求资源: request.getRequestURI() /  request.getRequestURL()

       http协议版本: request.getProtocol();

       请求头

       request.getHeader("name")

       request.getHeaderNames()

       实体内容:

       request.getInputStream();

    1)tomcat服务器接收到浏览器发送的请求数据

    2)tomcat服务器把请求数据封装成HttpServletRequest对象

    3)tomcat服务器调用doGet方法,把request对象传入servlet

    4)通过request对象获取请求数据

     结论: service方法和doXXX方法的关系?

       1)service方法是程序的入口。我们的代码逻辑就在这个方法被调用到。

        2)在HttpServlet的service方法源码中,根据不同请求方式调用了不同的doXX方法,

         所以我们在开发servlet的时候,就不需要去覆盖service方法,而是去doXX方法。

           因为get和post是最常用的的两种请求方式,所以只需要覆盖doGet和doPost方法即可!

    2.3 案例- user-agent-- 获取浏览器类型

    request.getHeader("user-agent");

    Firefox  Chrome  Trident

    2.4 案例- referer头  --- 防止非法链接

    2.5 获取参数数据

    get:  放在请求行的URI后面

    post: 放在请求的实体内容

    reuqest.getParameter("name")  获取一个值的参数

    request.getParameterValue("name")  获取多个值的参数

    request.getParameterNames() 获取所有参数名称

    request.getParameterMap()   获取所有参数对象

    解决get乱码问题:

    手动解码

    if("GET".equals(request.getMethod())){

    name = new String(name.getBytes("iso-8859-1"),"utf-8");

    }

    解决post乱码问题:

    request.setCharacterEncoding("utf-8");

    上述这句话要放在doPost方法的开始才能生效;1)在使用getParameter方法后在使用上述这代码解决乱码就失效;2)获取实体内容的流后在使用getParameter方法获取不到对象

    3 Http响应

    HTTP/1.1 200 OK       --响应行

    Server: Apache-Coyote/1.1   --响应头

    Content-Length: 24

    Date: Mon, 08 Jun 2015 01:51:04 GMT

                                 --一个空行

                                 -实体内容

    3.1 响应行

    http协议版本

    状态码:当前服务器处理请求的状态(结果)

    常见的状态码:

    200:  请求处理完成,成功返回!

    302:  需要浏览器进一步请求,才能完成。

    404: 浏览器端的错误。没有找到资源。

    500:  服务器端的错误。

    状态描述:对状态码的文字补充    

    3.2 响应头

    Location:  --重定向的地址。结合302状态使用完成重定向的效果

    Server:    --服务器的类型

    Content-Encoding:     --服务器发送给浏览器的数据压缩格式

    Content-Length:         --服务器发送给浏览器的数据长度

    Content-Language:    --服务器支持语言

    Content-Type:     --服务器发送给浏览器的数据类型和数据编码格式

    Last-Modified:    --服务器资源的最后修改时间

    Refresh:        ---定时刷新或每隔n秒跳转资源

    Content-Disposition:   -- 以下载方式打开资源

    Transfer-Encoding:            

    Set-Cookie:     -- 服务器发送给浏览器的cookie数据

    Expires: -1            --通知浏览器不使用缓存

    Cache-Control: no-cache

    Pragma: no-cache   

    Connection:    连接状态

    Date:   响应发出的时间

    使用HttpServletResponse修改响应数据

          response.setStatus(404) 设置状态码

          response.setHeader("name","value")  修改响应头

          response.getWriter().append()  以字符形式发送实体内容

          response.getWriter().write()   以字符形式发送实体内容

          response.getOutputStream().write()  以字节形式发送实体内容

    请求重定向

    1) SetStatus(302)

    setHeader(“location”,”/day/1.html”);

    2) sendRedirect(“day/1.html”);

    定时刷新

    1) setHeader(“refresh”,”3”);

    2) setHeader("refresh", "3;/day/1.html");在IE11以下的浏览器版本中可能无法实现;

  • 相关阅读:
    CSS3中的Transition属性详解
    jq 全选/取消效果
    多维数组问题 int (*a)[] int []
    C语言输入多组问题~ungetc回退字符到stdin
    2015-12-14重启博客之旅
    转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
    lsof 一切皆文件
    转载自~浮云比翼: 不忘初衷,照顾好自己。
    转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
    梳理回顾
  • 原文地址:https://www.cnblogs.com/lldsgj/p/10801162.html
Copyright © 2020-2023  润新知