1. 程式人生 > 其它 >2022.3.2#P1605 迷宮——一個簡單的DFS

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() 強制性讓會話立即失效