JavaWeb 03 HTTP协议

1、Http

概念

报文:用来传递封装数据
报文包括:报文首行,报文头,报文空行和报文体

具体分为:
请求报文:浏览器 ——> 服务器
响应报文:服务器 ——> 浏览器

Tips:可以通过浏览器的开发者工具查看报文

请求报文

客户端连上服务器后,向服务器发出获取某个Web资源的消息,称之为客户端向服务器发送了一个HTTP请求

一个完整的HTTP请求包括如下内容:
①请求首行
包括:请求的方式、请求的地址、请求的协议版本号
例如:GET /项目名/HTML页面 HTTP/1.1

Tips:
① POST请求的URL【请求地址】没有携带请求参数,所以相对于携带了请求参数的GET请求来说,它相对安全
② URL地址中如果包含中文,浏览器会自动对中文字符进行编码之后再发送【显示的是乱码】

②若干消息头(请求头)
key value的形式,中间用空格隔开。有多个请求头

⒈ Accept 接收:可以接收哪些类型的文件
/ 所有的类型都可以接收

⒉ Accept-Encoding 可以支持的压缩方式

⒊ Accept-Language 客户端的系统语言
zh-CN 中文

⒋ Connection
Keep-Alive 保证当前页面中的所有的资源下载成功后,再断开连接
从HTTP 1.1开始,如果一个标签引用了href的资源,或引入了src的资源

⒌ Host 主机地址
localhost:8080

⒍ User-Agent 用户客户端的信息,浏览器和系统信息

⒎ Content-Length 请求体的内容长度
注意:这个键值对只有POST请求才有,GET请求没有

③实体内容(请求体)
用于携带请求参数。GET请求没有内容;POST请求有内容
因为GET请求的参数在URL中携带了,所以没有请求体

⒈ 如果URL地址携带了请求参数,则GET请求会将请求参数通过问号(?)和请求的URL连接key【input的name属性值】,value【input的value属性值】。key和value之间用等号(=)连接。多个参数之间使用& 连接
例如:项目名/HTML页面?username=root&password=1234

⒉ Referer
如果当前页面是通过其他页面跳转过来的,则请求头中会携带一个Referer
应用于广告计费【是否是通过搜索跳转来的】或解决安全问题【是否是通过指定的页面跳转过来的】
请求报文

GET请求和POST请求的区别

⑴ GET请求会在URL中携带请求参数;POST请求会在请求体中携带请求参数
⑵ GET请求的请求参数会在URL中被看到,不安全;POST请求的请求参数通过请求地址看不到
⑶ URL地址栏最多支持255个字符,所以GET请求参数有大小限制;POST请求通过请求体传递请求参数,对大小没有限制,所以文件上传都是通过POST请求实现的
⑷ 如果GET请求的请求参数中包含中文,则请求地址中会有中文乱码。因为URL地址栏采用的是URLEncoding编码格式,会将中文参数转化为二进制数据,在将二进制数据通过URLEncode编码转换为16进制的数,三个%加数字对应一个汉字
  例如:
    张【%E5%BC%A0】
    三【%E4%B8%89】
    示例:username=%E5%BC%A0%E4%B8%89

响应报文

所谓响应其实就是服务器对请求处理的结果,或者如果浏览器请求的直接就是一个静态资源的话,响应的就是这个资源本身

HTTP响应的组成
①响应状态行
包括:协议版本、响应状态码、响应状态信息
例如:HTTP/1.1 200 OK
常见的响应状态码

②响应消息头:响应头
key value的形式,中间用空格隔开。有多个请求头

⒈ Content-Length
响应内容的大小

⒉ Server
服务器版本
例如:Apache-Coyote/1.1

③实体内容:响应体
就是服务器给浏览器要显示的内容
响应报文

2、HttpServletResponse接口

概念

    代表服务器给浏览器的响应。在浏览器访问服务器时,服务器会创建一个响应对象,就是HttpServletResponse。当调用service方法时,将其作为参数传入,最终传入到doGet或doPost方法中
    通过该响应对象,可以给浏览器一个显示内容【通过流向响应体中写入数据】,或者发起请求的重定向

常用方法

getWriter

 public PrintWriter getWriter() throws IOException;

获取一个输出流。就是服务器向浏览器写响应的流。可以写一个字符串,或HTML代码片段,甚至是完整的HTML页面

这是HttpServletResponse的父接口ServletResponse的方法

sendRedirect

 public void sendRedirect(String location) throws IOException;

发起请求的重定向。服务器给浏览器一个特殊的响应,这个响应用于告诉浏览器再次发送一个请求,并且会把地址告诉浏览器
    应用于:当请求到达服务器资源时,服务器资源不能处理或不想处理请求。就可以给一个特殊的响应告诉浏览器去找服务器的其他资源,并且把资源地址(Location)告诉浏览器

重定向的特点

⑴ 浏览器的地址栏发生了变化,显示的是最终访问的地址
⑵ 浏览器发起了两次请求
    ① 第一次请求得到的响应头:
        HTTP/1.1 302 Found
        Location: /项目名/页面名.html
        服务器告诉浏览器再发送一次请求。Location对应的值就是第二次请求的地址
    ② 第二次请求得到的响应报文:
    就是Location中的地址所响应的内容
⑶ 浏览器最终显示的时第二次请求所响应的内容
⑷ 第二次请求的发起,其请求报文和第一次请求的请求报文不同,它是又重新封装的

3、HttpServletRequest接口

概念

在浏览器访问服务器时,服务器会将浏览器发送的请求封装成为一个HttpServletRequest对象。并在调用service方法时,将其作为参数传入

常用方法

getParameter

 public String getParameter(String name);

获取浏览器发出的请求参数。需要传入HTML页面中的元素的name属性值
例如:获取User-Agent:
request.getHeader(“User-Agent”);

这是HttpServletRequest的父接口ServletRequest的方法

getHeader

  public String getHeader(String name);

通过请求头的key获取对应的value

getServerName

  public String getServerName();

获取请求地址的服务器名。相当于根据请求的url地址,从里面将服务器名截取出来
例如:
请求地址为:http://127.0.0.1:8080/MyWebApp/loginServlet
则截取的服务器名就是127.0.0.1

这是HttpServletRequest的父接口ServletRequest的方法

getServerPort

   public int getServerPort();

获取服务器的端口号

这是HttpServletRequest的父接口ServletRequest的方法

getContextPath

  public String getContextPath();

获取 “/” + 当前项目名
例如:当前项目名为;MyWebApp,
则方法的返回值为:/MyWebApp

getQueryString

  public String getQueryString();

获取GET请求的请求参数,即URL地址中?后面的键值对
例如:GET请求的URL
http://localhost:8080/MyWebApp/login?username=root&password=1234
则方法的返回值为:
username=root&password=1234

注意:如果浏览器请求方式为POST请求,则该方法的返回值为null

getRequestDispatcher

public RequestDispatcher getRequestDispatcher(String path);

获取请求转发器。可以通过请求转发器来转发,需要调用RequestDispatcher的forward 方法

RequestDispatcher接口的forward方法
   public void forward(ServletRequest request, ServletResponse response);

通过该方法可以实现请求的转发。需要将请求和响应对象传入

请求的转发

    如果客户端发给服务器的请求,服务器不想或不能处理,则服务器会在内部调用其他资源进行处理

请求的转发的特点

    ⑴ 客户端浏览器不知道最终处理请求的是哪个资源文件
    ⑵ 浏览器的地址栏中的URL地址没有发生改变
    ⑶ 只有一次请求

4、请求的转发和请求的重定向对比

                                    请求的转发                                              请求的重定向
 发起者  request.getRequestDispatcher(path).forward(request, response); 【转发】     response.sendRedirect(path); 【重定向】
浏览器感知                           不知道                                                     知到
请求次数                              1次                                                       2次
浏览器地址栏的改变                  没有改变                                                发生了改变
浏览器显示的内容                 path响应的内容                                           path响应的内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值