2022.3.2#P1605 迷宮——一個簡單的DFS
HTTP
Hyper Text Transfer Protocol 超文字傳輸協議,作用確定請求和響應的格式,瀏覽器傳送伺服器的資料 - 請求報文,伺服器返回客戶端的資料 - 響應報文;
HTTP 基於TCP/IP通訊協議來傳遞資料。
HTTP 基於客戶端/服務端(C/S)架構模型,通過一個可靠的連結來交換資訊,是一個無狀態的請求/響應協議。
請求報文
請求行
包含三個資訊 1 請求方式 2 請求URL 3 請求協議
請求訊息頭
-
Accept 屬性告訴服務端 客戶端接受什麼型別的響應 ( 訊息能包含文字、影象、音訊、視訊以及其他應用程式 專用的資料)
-
Cookie 客戶端的Cookie就是通過這個屬性傳給服務端
Cookie: $Version=1; Skin=new; jsessionid=5F4771183629C9834F8382E23BE13C4C
服務端 根據 jsessionid 客戶端的多個請求是隸屬於一個 Session
-
Referer 表示這個請求是從哪個URL過來的
-
Cache-Control 對快取進行控制,可以設定響應返回資料在客戶端快取的時間,或者不快取
Cache-Control: no-cache
預設設定不快取
// 獲取請求報文中的屬性名稱 java.util.Enumeration<java.lang.String> getHeaderNames(); // 獲取指定名稱的報文頭屬性的值 java.lang.String getHeader(java.lang.String name) // 獲取報文頭中的Cookie(讀取Cookie的報文頭屬性) Cookie[] getCookies() ; // 獲取Seesion 通過 Cookie JSESSIONID屬性 可以獲取請求關聯的 Session HttpSession getSession() // 獲取客戶端本地化資訊(讀取 Accept-Language 的報文頭屬性) java.util.Locale getLocale() // 獲取請求報文體的長度(讀取Content-Length的報文頭屬性) int getContentLength();
請求體
- GET 方式 ,沒有請求體,但是有一個 queryString
- POST 方式,有請求體,form data
- JSON 方式,有請求體,requet payload
響應報文
**響應狀態行 **
協議 / 響應狀態碼 響應狀態
響應訊息頭
-
Cache-Control 響應輸出到客戶端後,服務端通過該報文頭屬告訴客戶端如何控制響應內容的快取
Cache-Control: max-age=3600
設定讓客戶端對響應內容快取3600秒,也即在3600秒內,如果客戶再次訪問該資源,直接從客戶端的快取中返回內容給客戶,不要再從服務端獲取; -
**ETag ** 一個代表響應服務端資源(如頁面)版本的報文頭屬性,如果某個服務端資源發生變化了,這個ETag就會相應發生變化。它是Cache-Control的有益補充,可以讓客戶端“更智慧”地處理什麼時候要從服務端取資源,什麼時候可以直接從快取中返回響應;
-
Location 我們在JSP中讓頁面Redirect到一個某個A頁面中,其實是讓客戶端再發一個請求到A頁面,這個需要Redirect到的A頁面的URL,其實就是通過響應報文頭的Location屬性告知客戶端的;
-
Set-Cookie 服務端可以設定客戶端的Cookie,其原理就是通過這個響應報文頭屬性實現的
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
// 新增一個響應報文頭屬性
void setHeader(String name, String value)
// 新增Cookie報文頭屬性
void addCookie(Cookie cookie)
// 不但會設定Location的響應報文頭,還會生成303的狀態碼
void sendRedirect(String location)
HTTP 無狀態
伺服器無法判斷這兩次請求是同一個客戶端發過來的,還是不同的客戶端發過來的;
會話跟蹤
通過會話跟蹤技術來解決無狀態的問題,客戶端第一次發請求給伺服器,伺服器獲取 session,獲取不到,則建立新的,然後響應給客戶端,下次客戶端給伺服器發請求時,會把sessionID帶給伺服器,那麼伺服器就能獲取到了,那麼伺服器就判斷這一次請求和上次某次請求是同一個客戶端,從而能夠區分開客戶端;
API | Explain |
---|---|
request.getSession() | 獲取當前的會話,沒有則創鍵一個新的會話 |
request.getSession(true) | 效果和不帶引數相同 |
request.getSession(false) | 獲取當前會話,沒有則返回 null |
session.getId() | 獲取 sessionID |
session.isNew() | 判斷當前 session 是否是新的 |
session.getMaxInactiveInterval() | 獲取 session 非啟用時長,預設 1800 秒(半小時) |
session.invalidate() | 強制性讓會話立即失效 |