前言:在我们编写Servlet类的时候,实际上是不会去直接继承GenericServlet类(中间适配器类)的,因为我们是B/S架构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范当中,提供了一个类叫做HttpServlet,它是专门为HTTP协议准备的一个Servlet类。
Servlet整体的继承结构如下:
Servlet(接口)爷爷辈
GenericServlet implements Servlet(抽象类)儿子辈
HttpServlet extends GenericServlet(抽象类)孙子辈
1、什么是HTTP协议?
HTTP协议又称为超文本传输协议,由万维网制定的,是处于应用层的一种协议,规定了信息传输的格式;
HTTP是基于B/S架构进行通信的,可以实现浏览器与服务器的解耦合。
总的来说,HTTP协议是W3C制定的超文本传输协议;B向S发送数据要遵循HTTP协议,同样S向B发送数据也要遵循HTTP协议,这样才能实现B与S的解耦合;简单的说,HTTP协议就是提前制定好的消息模板。要注意,HTTP协议是一种无状态协议。
2、HTTP协议的内容?
HTTP协议包括请求协议和响应协议两种。
2.1请求协议
请求协议包括请求行、请求头、空白行、请求体四部分。
Get请求具体报文:
GET /jeecg-boot/mdm/rejectsItem/queryPage? current=1&size=50&queryItems=%255B%257B%2522val%2522:%2522123455%2522,%2522field%2522:%2522rejectsCode%2522,%2522rule%2522:%2522like%2522%257D%255D HTTP/1.1 请求行
Host: 127.0.0.1:3000 请求头
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="8"
Accept: application/json, text/plain, */*
tenant-id: 0
sec-ch-ua-mobile: ?0
X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NTg4MTM4MDMsInVzZXJuYW1lIjoiYWRtaW4ifQ.ZdHoOn8YZRYO751A47P6ze0GPHwUPfDFnNCEjxIp8k0
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.3161 SLBChan/30
Origin: http://localhost:3000
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
空白行
请求体
Post请求具体报文:
POST /jeecg-boot/sys/login HTTP/1.1 请求行
Host: 127.0.0.1:3000 请求头
Connection: keep-alive
Content-Length: 86
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="8"
Accept: application/json, text/plain, */*
tenant-id: 0
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.3161 SLBChan/30
Content-Type: application/json;charset=UTF-8
Origin: http://localhost:3000
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
空白行
{"username":"admin","password":"123456","captcha":"","checkKey":"","remember_me":true}
请求体
2.1.1请求行
请求行由三部分组成:
请求方式:Get Post Put
URI: /jeecg-boot/sys/login
协议版本号: HTTP/1.1
2.2响应协议
响应协议包括状态行、响应头、空白行、响应体四部分。
响应协议具体报文:
HTTP/1.1 200 OK 状态行
X-Powered-By: Express 响应头
access-control-allow-origin: http://localhost:3000
access-control-allow-methods: GET,POST,OPTIONS,PUT,DELETE
access-control-allow-credentials: true
set-cookie: rememberMe=deleteMe; Path=/jeecg-boot; Max-Age=0; Expires=Mon, 04-Jul-2022 09:37:57 GMT; SameSite=lax
vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
content-type: application/json
transfer-encoding: chunked
date: Tue, 05 Jul 2022 09:37:57 GMT
connection: close
空白行
{"message":"success","code":0,"data":{"records":[{"id":"589055795316916224"}] 响应体
2.2.1状态行
状态行由三部分组成:
协议版本号: HTTP/1.1
状态码:200(表示成功)
404(表示访问的资源不存在,通常原因可能是路径错误或者服务器对应的资源没有启动成功)
405(表示前端发送的请求方式与后端请求处理的方式不一致)
500(表示服务器端的错误)
状态的描述信息:ok
2.2.2响应头
响应头包括响应的内容类型、响应的时间等
2.2.3空白行
空白行用来分隔响应头和响应体的
2.2.4响应体
响应体是响应的具体内容,通常是一段字符串,通过浏览器的渲染并最终展示出来
3、补充
3.1URL与URI
URI:统一资源标识符,代表网络中某个资源的名字,但是通过URI无法定位到资源
URL:统一资源定位符,代表网络中的某个资源,可以通过URL定位到资源
通常URL包括URI。
3.2Get请求与Post请求的区别
get请求发送数据的时候,数据会挂在URI后面,会在地址栏上显示;
post请求发送数据的时侯,在请求体中发送,不会回显在地址栏上;
get请求只能发送普通的字符串,并且发送的字符串长度有限制,不同的浏览器限制不同,这个没有明确的规范;
get请求无法发送大数据量;
post请求可以发送任何类型的数据,包括普通字符串,流媒体等信息:视频、声音、照片等;
post请求可以发送大数据量,理论上没有限制;
在W3C中是这样说的:get请求比较适合从服务器端获取数据;post请求比较适合向服务器端发送数据。因此,get请求是安全的,post请求是危险的;
get请求支持缓存;post请求不支持缓存;