Servlet学习笔记【2】---Http数据包

本文主要讲Http协议相关知识。

1 Http协议特点

单向性:客户端和服务端是单向通信的,只有客户端发请求,服务端才会响应产生。(异于推送模式)

无状态:协议本身并没有状态的记录,当客户端多次访问服务器时,服务端并不知道你曾经访问。STP协议是有状态的(即客户端连接服务端后,服务端会记录连接状态,下次链接继续上次状态。例如:下载时支持断点续传),而Http是无状态的,因此需要其它的技术实现状态记录(session、cookie)。

2 Http模式下发送请求方式

基于http协议我们能够采用哪些方式来发送请求呢?常用的有如下四种:

DoGet

DoPost

DoHead

DoDelete

DoGet和DoPost的区别:

1)get方式提交表单表单中的数据会在地址栏中显示。而post方法则不会。例如:百度中输入java后,地址栏中?后边有个wd=java。注意:在浏览器地址栏输入地址方式,永远是get方式。

2)get方式提交表单长度是有限制的512字节,而post理论上是无限的。说明:浏览器地址栏输入的字符长度是有限的,因此,get方式有长度显示。

3)get方式提交表单会在http数据包中的第一行出现,而post在空一行的body中出现。

4)get方式永远是以字符方式提交。而post既可以以字符也可以以字节。说明1:get方式内容会在浏览器输入框中显示,因此是字符方式。说明2:当做文件上传时,提交必须以post方式;当用户名和密码提交时,必须用post方式,因为get会造成信息泄露。

 3 Http数据包

B/S结构,完全是基于http数据包进行传递信息的(请求和响应)。

3.1 Get方式Http数据包

在serverSockt创建一个服务器,并将请求的数据包打印出来:

 1 package test1;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStreamReader;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 public class Server {
 9 
10     public static void main(String[] args) throws Exception {
11         ServerSocket ss = new ServerSocket(8080);
12         Socket s = ss.accept();
13         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
14         String str;
15         while((str = br.readLine()) != null) {
16             System.out.print(str + '
');
17         }
18     }
19 }

运行该代码启动服务器,在浏览器地址栏中输入:http://127.0.0.1:8080/index.html?key=value&key1=value1

在eclipse控制台中,可以看到如下打印日志:

 1 GET /index.html?key=value&key1=value1 HTTP/1.1
 2 Host: 127.0.0.1:8080  // 请求地址
 3 Connection: keep-alive
 4 Cache-Control: max-age=0
 5 Upgrade-Insecure-Requests: 1
 6 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, 
 7 like Gecko) Chrome/69.0.3497.100 Safari/537.36
 8 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/a   // 浏览器支持的文件格式
 9 png,*/*;q=0.8
10 Accept-Encoding: gzip, deflate, br  //浏览器支持的编码
11 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,de;q=0.6,zh-TW;q=0.5,en-US;  // 浏览器支持的语言
12 q=0.4

从上边日志可以看出,这是Get方式的Http数据包

3.2 Post方式Http数据包

1)首先创建一个test.html文件,里边有个表单,并且请求方式设置为post:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <form action="http://127.0.0.1:8888" method="post">
 9     <input type="text" name="username" value="zhaoweikai"/>
10     <input type="text" name="userage" value="25"/>
11     <input type="submit" value="提交"/>
12 </form>
13 </body>
14 </html>

2)通过TcpTrace工具,打印出表单提交时的请求Http数据包

首先要配置TcpTrace软件监听端口(8888)和目标端口(8080):

说明:tcpTrace是一款小巧的获取请求报文和响应报文的工具,使用非常简单。

 3)启动一个Tomcat服务

Tomcat默认监听端口8080。如何启动Tomcat这里不再说明,可以看这个。

4)在浏览器中打开上边test.html文件,点击提交按钮

5)在TcpTrace软件中,可以看到Post方式下的Http数据包如下:

 1 POST / HTTP/1.1
 2 Host: 127.0.0.1:8888
 3 Connection: keep-alive
 4 Content-Length: 30
 5 Cache-Control: max-age=0
 6 Upgrade-Insecure-Requests: 1
 7 Origin: null
 8 Content-Type: application/x-www-form-urlencoded
 9 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
11 Accept-Encoding: gzip, deflate, br
12 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,de;q=0.6,zh-TW;q=0.5,en-US;q=0.4
13 
14 username=zhaoweikai&userage=25

从上边代码可以看出,表单数据内容在最后的内容中显示。

参考资料&内容来源:

速学堂:http://www.sxt.cn/tomcat/1-2-5.html

原文地址:https://www.cnblogs.com/zhaoweikai/p/9877582.html