2020年HTTP课堂笔记

HTTP

HTTP协议

本节用到的结构:
在这里插入图片描述

概念:超文本传输协议

传输定义:定义了客户端服务器端通信时,发送数据的格式

特点:

  1. 基于TCP/IP的高级协议(三次握手,安全)
  2. 默认端口号:80
  3. 基于请求/响应模型:一次请求对应一次响应
  4. 无状态:每次请求之间相互独立,不能交互数据

版本不同:

  • 1.0版本:每一次请求建立新的连接
  • 1.1版本:复用连接

HTTP协议内容:

请求消息:客户端发送给服务器端的数据
  1. 请求行
  • 格式:请求方式 请求url 请求协议/版本

    例子: GET login.html HTTP/1.1

  • HTTP协议中常用的2种请求方式:

    GET

    1. 请求参数在请求行中,在url后
    2. 请求的url长度有限度
    3. 不太安全

    POST

    1. 请求参数在请求体
    2. 请求的url长度没有限制的
    3. 相对安全
  1. 请求头:客户端浏览器向服务器端传输一些信息
  • 请求头名称:请求头值

    常用的2种请求头:

    1. User-Agent:返回服务器端,该浏览器的版本信息

    2. Referer:url路径:告诉服务器请求来源

      作用:防盗链,统计工作。

  1. 请求空行:空行,用于分割请求头,和请求体

注意:post请求方式才有请求体

  1. 请求体(正文):封装POST请求消息的请求参数

请求消息数据格式实力字符串

响应消息:服务器端发送给客户端的数据
  1. 响应行

    组成:协议/版本 响应状态码 状态码描述

    响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

  • 状态码分类:
状态码 含义 代表
1xx 服务器接收客户端消息,但没有接收完成,等待一段时间
2xx 成功 200(成功)
3xx 成功,重定向 302(重定向),304(访问缓存)
4xx 失败,客户端错误 404(请求资源路径错误),405(请求方式没有对应的doXxx方法)
5xx 失败,服务器错误 500(服务器的内部异常)
  1. 响应头

格式:头名称:值

常见的响应头:

  1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式

  2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据

    参数值:

    • in-line:默认值,在当前页面内打开
    • attachment;filename=xxx:以附件形式打开响应体。文件下载
  3. 响应空行

  4. 响应体

Request

request对象和response对象的原理

request对象和response对象是由服务器创建的。

  • request对象用于请求消息
  • response对象用于设置响应消息

request对象继承体系结构

ServletRequest —— 接口

​ | 继承

HttpServletRequest

​ | 实现

RequestFacade类(Tomcat)

request功能

获取请求消息数据

  1. 获取请求行数据

    方法声明 功能描述
    String getMethod() 获取请求方式
    String getContextPath() 获取虚拟目录
    String getServletPath() 获取Servlet路径
    String getQueryString() 获取get方式请求参数
    String getRequestURL() 获取请求URL,URL相对路径
    StringBuffer getRequestURL() 获取请求URL,URL绝对路径
    String getProtocol() 获取协议及版本:HTTP/1.1
    String getRemoteAddr() 获取客户机的IP地址
  2. 获取请求头数据

    方法声明 功能描述
    String getHeader(String name) 通过请求头的名称获取请求头的值
    Enumeration getHeaderNames() 获取所有的请求头名称
  3. 获取请求体数据

    注意:只有POST请求方式才有请求体

    1. 获取流对象
    方法声明 功能描述
    BufferedReader getReader() 获取字符输入流,只能操作字符数据
    ServletInputStream getInputStream() 获取字节输入流,可以操作所有类型数据
    1. 再从流对象中拿数据
  4. 其他功能

    获取请求参数通用方式

    方法声明 功能描述
    String getParameter(String name) 根据参数名称获取参数值
    String[] getParameterValues(String name) 根据参数名称获取参数值的数组
    Enumeration getParameterNames() 获取所有请求的参数名称
    Map<String,String[]> getParameterMap() 获取所有参数的map集合

    中文乱码问题:

    1. get方式:Tomcat 8 已经将get方式乱码问题解决了
    2. post方式:会乱码
      解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8")

请求转发:一种在服务器内部的资源跳转方式

  1. 步骤:

    1. 通过request对象获取请求转换器对象:

      RequestDispatcher getRequestDispatcher(String path)

    2. 使用RequestDispatcher对象来进行转发:

      forward(ServletRequest request,ServletResponse response)

  2. 特点:

    • 浏览器地址栏路径不发生变化
    • 只能转发到当前服务器内部资源中
    • 转发是一次请求

共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据

  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

  • 常用方法:

    方法声明 功能描述
    void setAttribute(String name,Object obj) 存储数据
    Object getAttitude(String name) 通过键获取值
    void removeAttribute(String name) 通过键移除值对
  • 获取ServletContextServletContext getServletContext()

Response

Response对象

功能:设置响应消息

  1. 设置响应行

    格式:协议/版本 响应状态码 状态码描述(HTTP/1.1 200 ok)

    设置响应头:setStatus(int sc)

  2. 设置响应头:setHeader(String name,String value)

  3. 设置响应体(使用步骤):

    1. 获取输出流

      字符输出流:PrintWriter getWriter()

      字节输出流:ServletOutputStream getOutputStream()

    2. 使用输出流,将数据输出到客户端浏览器

使用案例

完成重定向

重定向:资源跳转的方式

重定向(redirect)的特点:

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求(服务器1响应302跳转到服务器2,服务器2响应200),不能使用request对象共享数据

转发(forward)的特点:

  1. 转发地址栏路径不变
  2. 转发只能访问当前服务器下的资源
  3. 转发是一次请求,可以使用request对象共享数据

路径写法

  1. 路径分类:

相对路径:通过相对路径不可以确定唯一资源

规则:找到当前资源和目标资源之间的相对位置

  • ./:当前目录
  • ../:后退一级目录

绝对路径:通过绝对路径可以确定唯一资源

  1. 规则:判断定义的路径给谁用的?
  • 客户端浏览器使用:需要加虚拟目录(项目的访问路径)
    • 动态获取虚拟目录:request.getContextPath()
    • 如:<a><form>、重定向……
  • 服务器使用:不需要加虚拟目录
    • 如:转发路径

服务器输出字符数据到浏览器

步骤:

  1. 获取字符输出流
  2. 输出数据

解决乱码问题:

  1. PrintWriter pw = response.getWriter()
  2. 设置该流的默认编码
  3. 告诉浏览器响应体使用的编码,在获取流之前设置编码如:response.setContentType("text/html;charset=utf-8");

服务器输出字节数据到浏览器

实现步骤:

  1. 获取字节输出流
  2. 输出数据

验证码的作用:

  1. 本质:图片
  2. 目的:防止恶意表单注册

ServletContext对象

概念:代表整个web应用,可以和程序的容器(服务器)来通信

获取:

  1. 通过request对象获取:request.getServletContext();
  2. 通过HttpServlet获取:this.getServletContext();

注意:两种获取方法只有一个ServletContext对象

功能:

  1. 获取MIME类型:

    • MIME类型:在互联网通信过程中定义的一种文件数据类型
      格式: 大类型/小类型 text/html
    • 获取:String getMimeType(String file)
  2. 域对象:共享数据

    1. setAttribute(String name,Object value)
    2. getAttribute(String name)
    3. removeAttribute(String name)

    ServletContext对象范围:所有用户所有请求的数据

  3. 获取文件的真实(服务器)路径:String getRealPath(String path)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章