一、Tomcat簡介?
Tomcat 服務器是一個免費的開放源代碼的Web應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。
1.1 Tomcat基本架構
Servlet接口文件中定義的方法有以下幾個:
- init():初始化Servlet
- getServletConfig():獲取Servlet配置信息
- service():服務..........
- getServletInfo():獲取Servlet的運行信息
- destroy():銷毀,回收內存
補充:?
- Servlet是接口文件,定義方法不需實現,通過其子類即GenericSrevlet(抽象類)及HttpSrevlet(抽象類)進行實現。
- 補充:抽象類中可以寫抽象方法,也可以寫實現方法,同時可以不實現接口中定義的全部抽象方法。
GenericSrevlet類中實現了init()、getServletConfig()、getServletInfo()、destroy()四個方法,把service()交由HttpSrevlet實現。
為什么在HttpSrevlet中實現service()方法??
HttpServlet中關于 service()定義如下:?
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();long lastModified;if (method.equals("GET")) {lastModified = this.getLastModified(req);if (lastModified == -1L) {this.doGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince = req.getDateHeader("If-Modified-Since");} catch (IllegalArgumentException var9) {ifModifiedSince = -1L;}if (ifModifiedSince < lastModified / 1000L * 1000L) {this.maybeSetLastModified(resp, lastModified);this.doGet(req, resp);} else {resp.setStatus(304);}}} else if (method.equals("HEAD")) {lastModified = this.getLastModified(req);this.maybeSetLastModified(resp, lastModified);this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[]{method};errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);}}
HttpServlet中定義service()是為了更好的匹配當前http的請求方式。
二、Tomcat簡化模型構建知識補充
2.1 HTTP協議
HTTP是一個客戶端終端(用戶)和服務器端(網站)請求和應答的標準(TCP)。
2.1.1 請求部分
請求部分包括請求頭、請求方式、請求內容,如請求方式等可以進行選擇,但是在發送請求時不能刪減。
2.1.1.1 請求頭
注:可以通過f12,選擇網絡進行查看。
2.1.1.2 請求方式
?GET
用途:獲取資源(查詢數據),參數通過 URL 的?Query String?傳遞(如?
/users?id=123
)。特點:
可見性:參數暴露在 URL 和瀏覽器歷史中。
長度限制:由瀏覽器和服務器共同決定(如 IE 限制為 2048 字符,Chrome 約 8KB),并非 HTTP 協議規定。
冪等性:多次請求結果相同(不修改資源)。
安全建議:避免用 GET 傳輸敏感信息(密碼、Token)。
POST?
用途:提交數據(創建或修改資源),參數在?請求體?中(支持多種編碼格式,如?
form-data
、JSON
)。特點:
無長度限制:理論上由服務器配置決定。
非冪等性:多次提交可能產生不同結果(如重復創建訂單)。
相對安全誤解:HTTP 明文傳輸下,POST 請求體仍可被攔截。真正的安全需依賴 HTTPS。
常見場景:表單提交、文件上傳、復雜數據(如嵌套 JSON),一般用來做增刪改操作。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
HEAD?
用途:獲取資源的?元數據(響應頭),不返回響應體。
典型應用:
檢查資源是否存在(通過狀態碼?
200
?或?404
)。驗證資源是否修改(通過?
Last-Modified
?或?ETag
?頭)。預加載資源信息(如?
Content-Length
?用于進度條)。
OPTIONS
用途:詢問服務器支持的 HTTP 方法?或?CORS 預檢請求。
CORS 預檢:
瀏覽器在跨域請求前自動發送 OPTIONS 請求。
服務器需返回?
Access-Control-Allow-Methods
?等頭,聲明允許的方法、頭、源。示例:
Access-Control-Allow-Methods: GET, POST, PUT
PUT
用途:完整替換資源(全量更新)。
冪等性:多次請求結果一致(如更新用戶信息為固定值)。
與 POST 區別:
POST 用于創建資源時,URI 由服務器決定(如?
/users
)。PUT 需客戶端指定完整資源路徑(如?
/users/123
)。
PATCH
用途:局部更新資源(如只修改用戶的郵箱)。
非冪等性:連續多次局部更新可能導致意外結果(如遞增計數器)。
實現方式:需定義數據格式(如 JSON Patch 標準)。
DELETE
用途:刪除指定資源。
冪等性:多次刪除同一資源結果相同(首次返回?
200
?或?204
,后續可能返回?404
)。注意:實際業務中常采用?邏輯刪除(標記為刪除狀態)而非物理刪除。
TRACE
用途:回顯客戶端請求,用于調試。
安全風險:可能引發?跨站追蹤攻擊(XST),多數服務器默認禁用。
CONNECT
用途:建立到目標服務器的?隧道連接,用于代理 HTTPS 流量。
工作流程:
客戶端發送?
CONNECT example.com:443 HTTP/1.1
。代理服務器建立 TCP 連接到目標服務器。
后續數據直接透傳(用于 TLS 加密通信)
關鍵對比總結
特性 | GET | POST | PUT | PATCH | DELETE |
---|---|---|---|---|---|
冪等性 | ?? | ? | ?? | ? | ?? |
安全性 | 低 | 中 | 中 | 中 | 中 |
數據位置 | URL | Body | Body | Body | URL |
?
2.1.2 響應部分
響應部分包括響應頭、響應狀態、響應內容。
2.1.2.1 響應頭
注:可以通過f12,選擇網絡進行查看。
2.1.2.2 響應狀態
- 200:ok
- 404:url出錯
- 500:服務器內部錯誤
2.1.2.3 響應內容
響應內容就是傳輸的內容。
2.2 數據傳輸
在tomcat中,接口信息及參數等的數據傳遞的底層通過I/O實現,隨后將數據給到ServletRequest/ServletReqsponse。
2.2.1 request
request中接受的信息(僅列舉一部分):
- method:請求方式
- 編碼方式:如JSON
- data:parameter
- url:請求地址
- cookie:獲取登錄信息
2.2.2 response
response中包含的信息(僅列舉一部分):
- 狀態碼
- 編碼方式:如JSON
- 字符集:如utf-8
- data數據