Tomcat&JavaWeb&HTTP
文章目錄
- Tomcat&JavaWeb&HTTP
- 一、Tomcat
- 1.1 版本選擇及安裝
- 1.2 目錄
- 1.3 WEB項目部署的方式
- 二、IDEA中Java Web開發部署流程
- 三、HTTP協議
- 3.1 發展歷程
- 3.2 HTTP協議的會話方式
- 3.3 請求報文
- 3.4 響應報文
一、Tomcat
Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。最新的Servlet 和JSP 規范總是能在Tomcat 中得到體現,因為Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發商的認可,成為目前比較流行的Web 應用服務器。
1.1 版本選擇及安裝
版本:企業用的比較廣泛的是8.0和9.0,目前比較新正式發布版本是Tomcat10.0, Tomcat11仍然處于測試階段。從 Java EE 遷移到 Jakarta EE 的結果是,所有已實現 API 的主包已從 更改 javax.*
為jakarta.*
。這幾乎肯定需要更改代碼以使應用程序能夠從 Tomcat 9 及更早版本遷移到 Tomcat 10 及更高版本。官方有提供遷移工具。
- JAVAEE 版本和Servlet版本號對應關系 Jakarta EE Releases
Servlet Version | EE Version |
---|---|
6.1 | Jakarta EE ? |
6.0 | Jakarta EE 10 |
5.0 | Jakarta EE 9/9.1 |
4.0 | JAVA EE 8 |
3.1 | JAVA EE 7 |
3.1 | JAVA EE 7 |
3.0 | JAVAEE 6 |
- Tomcat 版本和Servlet版本之間的對應關系
Servlet Version | Tomcat Version | JDK Version |
---|---|---|
6.1 | 11.0.x | 17 and later |
6.0 | 10.1.x | 11 and later |
5.0 | 10.0.x (superseded) | 8 and later |
4.0 | 9.0.x | 8 and later |
3.1 | 8.5.x | 7 and later |
3.1 | 8.0.x (superseded) | 7 and later |
3.0 | 7.0.x (archived) | 6 and later (7 and later for WebSocket) |
下載
- Tomcat官方網站:http://tomcat.apache.org/
- 安裝版:需要安裝,一般不考慮使用。
- 解壓版:直接解壓縮使用,我們使用的版本。
安裝
-
正確安裝JDK并配置JAVA_HOME( https://injdk.cn中可以下載各種版本的JDK),配置了才能啟動
-
解壓tomcat到非中文無空格目錄
-
點擊bin/startup.bat啟動
-
打開瀏覽器輸入 http://localhost:8080訪問測試
-
直接關閉窗口或者運行 bin/shutdown.bat關閉tomcat
-
處理dos窗口日志中文亂碼問題: 修改
conf/logging.properties
,將所有的UTF-8修改為GBK
1.2 目錄
- bin:該目錄下存放的是二進制可執行文件;解壓版會有startup.bat和shutdown.bat文件控制服務器啟停
- conf:配置文件目錄,這個目錄下有四個最為重要的文件:
- server.xml:配置整個服務器信息。例如修改端口號。默認HTTP請求的端口號是:8080
- tomcat-users.xml:存儲tomcat用戶的文件,以及用戶的角色信息。用于從主頁進入Tomcat Manager頁面
- web.xml:部署描述符文件,這個文件中注冊了很多MIME類型,即文檔類型。文件類型映射配置文件
- context.xml:對所有應用的統一配置,通常不會去配置它
- lib:Tomcat的類庫
- logs:日志文件目錄,記錄了Tomcat啟動和關閉的信息,如果啟動Tomcat時有錯誤,那么異常也會記錄在日志文件中
- temp:存放Tomcat的臨時文件,這個目錄下的東西可以在停止Tomcat后刪除
- webapps:存放web項目的目錄,其中每個文件夾都是一個項目;如果目錄下已經存在目錄,這些是tomcat自帶的項目。其中ROOT是一個特殊的項目,在地址欄中訪問:http://127.0.0.1:8080,沒有給出項目目錄時,對應的就是ROOT項目。http://localhost:8080/examples,進入示例項目。其中
examples
就是項目名,即文件夾的名字 - work:運行時生成的文件,最終運行的文件都在這里。通過webapps中的項目生成的。可以把這個目錄下的內容刪除,再次運行時會生再次生成work目錄。當客戶端用戶訪問一個JSP文件時,Tomcat會通過JSP生成Java文件,然后再編譯Java文件生成class文件,生成的java和class文件都會存放到這個目錄下
1.3 WEB項目部署的方式
- 方式1:直接將編譯好的項目或者war包(tomcat啟動后會自動解壓war包)放在
webapps
目錄下 - 方式2:在tomcat中通過配置文件指向app的實際磁盤路徑
- 在tomcat的conf下創建Catalina/localhost目錄,并在該目錄下準備一個app.xml文件
<!-- path: 項目的訪問路徑,也是項目的上下文路徑,就是在瀏覽器中,輸入的項目名稱docBase: 項目在磁盤中的實際路徑-->
<Context path="/app" docBase="D:\mywebapps\app" />
二、IDEA中Java Web開發部署流程
- idea配置應用服務器:
settings -> Build, Execution, Deployment -> Application Servers
- 新建項目后,新建 Module,為 Module 添加 Tomcat 依賴
- 選擇module,雙擊shift,添加 framework support;idea低版本選中 module 右鍵也有該選項。添加 Web Application 并且勾選 web.xml
- IDEA部署-運行web項目:在運行和debug旁邊有編輯配置,添加tomcat Server,選擇
Local
,之后點擊右下角 Fix的配置項目,選擇帶_exploded
的(或者到該頁面Deployment
頁簽配置),配置完即可啟動了,瀏覽器將打開 index 頁面
IDEA部署并運行項目的原理:
- idea并沒有直接將編譯好的項目放入tomcat的webapps中
- idea根據關聯的tomcat,創建了一個tomcat副本,將項目部署到了這個副本中
- idea的tomcat副本在C:\用戶\當前用戶\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\中
- idea的tomcat副本并不是一個完整的tomcat,副本里只是準備了和當前項目相關的配置文件而已
- idea啟動tomcat時,是讓本地tomcat程序按照tomcat副本里的配置文件運行
- idea的tomcat副本部署項目的模式是通過conf/Catalina/localhost/*.xml配置文件的形式實現項目部署的
三、HTTP協議
3.1 發展歷程
HTTP/1.1
- HTTP 的第一個標準化版本 HTTP/1.1 ( RFC 2068 ) 于 1997 年初發布,支持七種請求方法:OPTIONS,GET,HEAD,POST,PUT,DELETE,和TRACE
- 發布后15年非常穩定,但之后出現了 HTTPS(安全超文本傳輸協議)。它是使用 SSL/TLS 進行安全加密通信的 HTTP 的安全版本
HTTP/2
- 由IETF在2015年發布。HTTP/2旨在提高Web性能,減少延遲,增加安全性,使Web應用更加快速、高效和可靠
- 多路復用:HTTP/2 允許同時發送多個請求和響應,而不是像 HTTP/1.1 一樣只能一個一個地處理。這樣可以減少延遲,提高效率,提高網絡吞吐量
- 二進制傳輸:HTTP/2 使用二進制協議,與 HTTP/1.1 使用的文本協議不同。二進制協議可以更快地解析,更有效地傳輸數據,減少了傳輸過程中的開銷和延遲
- 頭部壓縮:HTTP/2 使用 HPACK 算法對 HTTP 頭部進行壓縮,減少了頭部傳輸的數據量,從而減少了網絡延遲
- 服務器推送:HTTP/2 支持服務器推送,允許服務器在客戶端請求之前推送資源,以提高性能
- 改進的安全性:HTTP/2 默認使用 TLS(Transport Layer Security)加密傳輸數據,提高了安全性
- 兼容 HTTP/1.1:HTTP/2 可以與 HTTP/1.1 共存,服務器可以同時支持 HTTP/1.1 和 HTTP/2。如果客戶端不支持 HTTP/2,服務器可以回退到 HTTP/1.1
HTTP/3
- 于 2021 年 5 月 27 日發布 , HTTP/3 是一種新的、快速、可靠且安全的協議,適用于所有形式的設備。 HTTP/3 沒有使用 TCP,而是使用谷歌在 2012 年開發的新協議 QUIC
- HTTP/3 帶來了革命性的變化,以提高 Web 性能和安全性。設置 HTTP/3 網站需要服務器和瀏覽器支持
- 目前,谷歌云、Cloudflare和Fastly支持 HTTP/3。Chrome、Firefox、Edge、Opera 和一些移動瀏覽器支持 HTTP/3
3.2 HTTP協議的會話方式
瀏覽器與服務器之間的通信過程要經歷四個步驟
- 瀏覽器與WEB服務器的連接過程是短暫的,每次連接只處理一個請求和響應。對每一個頁面的訪問,瀏覽器與WEB服務器都要建立一次單獨的連接
- 瀏覽器到WEB服務器之間的所有通訊都是完全獨立分開的請求和響應對
3.3 請求報文
請求報文組成:
- 請求首行(請求行); GET/POST 資源路徑?參數 HTTP/1.1
- 請求方式 GET
- 訪問服務器的資源路徑?參數1=值1&參數2=值2 …
- 協議及版本 HTTP/1.1
- 請求頭信息(請求頭);
- 空行;
- 請求體;POST請求才有請求體
- 請求行
GET http://localhost:8080/TestWeb_war_exploded/ HTTP/1.1
- 請求頭
- 主機虛擬地址
Host: localhost:8080
- 長連接
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
- 請求協議的自動升級[http的請求,服務器卻是https的,瀏覽器自動會將請求協議升級為https的]
Upgrade-Insecure-Requests: 1
- 用戶系統信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
- 瀏覽器支持的文件類型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
- 當前頁面的上一個頁面的路徑[當前頁面通過哪個頁面跳轉過來的]: 可以通過此路徑跳轉回上一個頁面, 廣告計費,防止盜鏈
Referer: http://localhost:8080/TestWeb_war_exploded/login.html
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
- 瀏覽器支持的壓縮格式
Accept-Encoding: gzip, deflate, br
- 瀏覽器支持的語言
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=4A572D771E3A36F8CBCB791AB56C9D9E
3.4 響應報文
響應報文組成:
- 響應首行(響應行); 協議/版本 狀態碼 狀態碼描述
- 協議及版本 HTTP/1.1
- 響應狀態碼 200;HTTP 狀態碼(英語:HTTP Status Code)是用以表示 HTTP 響應狀態的 3 位數字代碼。
- 狀態描述 OK (缺省)
- 響應頭信息(響應頭);
- 空行;
- 響應體;
- 響應行
HTTP/1.1 200
- 響應頭
- 響應體數據的類型[瀏覽器根據類型解析響應體數據,如果響應的是html頁面,最終響應體內容會被瀏覽器顯示到頁面中]
Content-Type: text/html;charset=UTF-8
- 響應體內容的字節數
Content-Length: 111
- 響應的時間,這可能會有8小時的時區差
Date: Fri, 24 Nov 2023 08:22:39 GMT
Keep-Alive: timeout=20
Connection: keep-alive
- 下面是空行及響應體<html><head><title>$Title$</title></head><body>$END$<br />老鐵666</body>
</html>
常見響應狀態碼:
- 200: 請求成功,瀏覽器會把響應體內容(通常是html)顯示在瀏覽器中;
- 302: 重定向,當響應碼為302時,表示服務器要求瀏覽器重新再發一個請求,服務器會發送一個響應頭Location指定新請求的URL地址;
- 304: 使用了本地緩存
- 404: 請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源;
- 405: 請求的方式不允許
- 500: 請求資源找到了,但服務器內部出現了錯誤;
一般含義:
- 1xx:消息
- 2xx:成功
- 3xx:重定向
- 4xx:客戶端錯誤
- 5xx:服務器錯誤
更多狀態碼:
狀態碼 | 狀態碼英文描述 | 中文含義 |
---|---|---|
1** | 消息 | |
100 | Continue | 繼續。客戶端應繼續其請求 |
101 | Switching Protocols | 切換協議。服務器根據客戶端的請求切換協議。只能切換到更高級的協議,例如,切換到HTTP的新版本協議 |
2** | 成功 | |
200 | OK | 請求成功。一般用于GET與POST請求 |
201 | Created | 已創建。成功請求并創建了新的資源 |
202 | Accepted | 已接受。已經接受請求,但未處理完成 |
203 | Non-Authoritative Information | 非授權信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本 |
204 | No Content | 無內容。服務器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔 |
205 | Reset Content | 重置內容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。可通過此返回碼清除瀏覽器的表單域 |
206 | Partial Content | 部分內容。服務器成功處理了部分GET請求 |
3** | 重定向 | |
300 | Multiple Choices | 多種選擇。請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇 |
301 | Moved Permanently | 永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今后任何新的請求都應使用新的URI代替 |
302 | Found | 臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI |
303 | See Other | 查看其它地址。與301類似。使用GET和POST請求查看 |
304 | Not Modified | 未修改。所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之后修改的資源 |
305 | Use Proxy | 使用代理。所請求的資源必須通過代理訪問 |
306 | Unused | 已經被廢棄的HTTP狀態碼 |
307 | Temporary Redirect | 臨時重定向。與302類似。使用GET請求重定向 |
4** | 客戶端錯誤 | |
400 | Bad Request | 客戶端請求的語法錯誤,服務器無法理解 |
401 | Unauthorized | 請求要求用戶的身份認證 |
402 | Payment Required | 保留,將來使用 |
403 | Forbidden | 服務器理解請求客戶端的請求,但是拒絕執行此請求 |
404 | Not Found | 服務器無法根據客戶端的請求找到資源(網頁)。通過此代碼,網站設計人員可設置"您所請求的資源無法找到"的個性頁面 |
405 | Method Not Allowed | 客戶端請求中的方法被禁止 |
406 | Not Acceptable | 服務器無法根據客戶端請求的內容特性完成請求 |
407 | Proxy Authentication Required | 請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權 |
408 | Request Time-out | 服務器等待客戶端發送的請求時間過長,超時 |
409 | Conflict | 服務器完成客戶端的 PUT 請求時可能返回此代碼,服務器處理請求時發生了沖突 |
410 | Gone | 客戶端請求的資源已經不存在。410不同于404,如果資源以前有現在被永久刪除了可使用410代碼,網站設計人員可通過301代碼指定資源的新位置 |
411 | Length Required | 服務器無法處理客戶端發送的不帶Content-Length的請求信息 |
412 | Precondition Failed | 客戶端請求信息的先決條件錯誤 |
413 | Request Entity Too Large | 由于請求的實體過大,服務器無法處理,因此拒絕請求。為防止客戶端的連續請求,服務器可能會關閉連接。如果只是服務器暫時無法處理,則會包含一個Retry-After的響應信息 |
414 | Request-URI Too Large | 請求的URI過長(URI通常為網址),服務器無法處理 |
415 | Unsupported Media Type | 服務器無法處理請求附帶的媒體格式 |
416 | Requested range not satisfiable | 客戶端請求的范圍無效 |
417 | Expectation Failed | 服務器無法滿足Expect的請求頭信息 |
5** | 服務器錯誤 | |
500 | Internal Server Error | 服務器內部錯誤,無法完成請求 |
501 | Not Implemented | 服務器不支持請求的功能,無法完成請求 |
502 | Bad Gateway | 作為網關或者代理工作的服務器嘗試執行請求時,從遠程服務器接收到了一個無效的響應 |
503 | Service Unavailable | 由于超載或系統維護,服務器暫時的無法處理客戶端的請求。延時的長度可包含在服務器的Retry-After頭信息中 |
504 | Gateway Time-out | 充當網關或代理的服務器,未及時從遠端服務器獲取請求 |
505 | HTTP Version not supported | 服務器不支持請求的HTTP協議的版本,無法完成處理 |