HTTP
HTTP協議
本節用到的結構:
概念:超文本傳輸協議
傳輸定義:定義了客戶端與服務器端通信時,發送數據的格式
特點:
- 基於TCP/IP的高級協議(三次握手,安全)
- 默認端口號:80
- 基於請求/響應模型:一次請求對應一次響應
- 無狀態:每次請求之間相互獨立,不能交互數據
版本不同:
- 1.0版本:每一次請求建立新的連接
- 1.1版本:複用連接
HTTP協議內容:
請求消息:客戶端發送給服務器端的數據
- 請求行
-
格式:請求方式 請求url 請求協議/版本
例子: GET login.html HTTP/1.1
-
HTTP協議中常用的2種請求方式:
GET
:- 請求參數在請求行中,在url後
- 請求的url長度有限度
- 不太安全
POST
:- 請求參數在請求體中
- 請求的url長度沒有限制的
- 相對安全
- 請求頭:客戶端瀏覽器向服務器端傳輸一些信息
-
請求頭名稱:請求頭值
常用的2種請求頭:
-
User-Agent
:返回服務器端,該瀏覽器的版本信息 -
Referer:url路徑
:告訴服務器請求來源作用:防盜鏈,統計工作。
-
- 請求空行:空行,用於分割請求頭,和請求體
注意:post請求方式纔有請求體
- 請求體(正文):封裝POST請求消息的請求參數
請求消息數據格式實力字符串
響應消息:服務器端發送給客戶端的數據
-
響應行:
組成:協議/版本 響應狀態碼 狀態碼描述
響應狀態碼:服務器告訴客戶端瀏覽器本次請求和響應的一個狀態。
- 狀態碼分類:
狀態碼 | 含義 | 代表 |
---|---|---|
1xx | 服務器接收客戶端消息,但沒有接收完成,等待一段時間 | |
2xx | 成功 | 200(成功) |
3xx | 成功,重定向 | 302(重定向),304(訪問緩存) |
4xx | 失敗,客戶端錯誤 | 404(請求資源路徑錯誤),405(請求方式沒有對應的doXxx 方法) |
5xx | 失敗,服務器錯誤 | 500(服務器的內部異常) |
- 響應頭:
格式:頭名稱:值
常見的響應頭:
-
Content-Type
:服務器告訴客戶端本次響應體數據格式以及編碼格式 -
Content-disposition
:服務器告訴客戶端以什麼格式打開響應體數據參數值:
in-line
:默認值,在當前頁面內打開attachment;filename=xxx
:以附件形式打開響應體。文件下載
-
響應空行
-
響應體
Request
request
對象和response
對象的原理
request對象和
response對象是由服務器創建的。
request
對象用於請求消息response
對象用於設置響應消息
request
對象繼承體系結構
ServletRequest
—— 接口
| 繼承
HttpServletRequest
| 實現
RequestFacade
類(Tomcat)
request
功能
獲取請求消息數據
-
獲取請求行數據
方法聲明 功能描述 String getMethod() 獲取請求方式 String getContextPath() 獲取虛擬目錄 String getServletPath() 獲取Servlet路徑 String getQueryString() 獲取get方式請求參數 String getRequestURL() 獲取請求URL,URL相對路徑 StringBuffer getRequestURL() 獲取請求URL,URL絕對路徑 String getProtocol() 獲取協議及版本:HTTP/1.1 String getRemoteAddr() 獲取客戶機的IP地址 -
獲取請求頭數據
方法聲明 功能描述 String getHeader(String name) 通過請求頭的名稱獲取請求頭的值 Enumeration getHeaderNames() 獲取所有的請求頭名稱 -
獲取請求體數據
注意:只有POST請求方式纔有請求體
- 獲取流對象
方法聲明 功能描述 BufferedReader getReader() 獲取字符輸入流,只能操作字符數據 ServletInputStream getInputStream() 獲取字節輸入流,可以操作所有類型數據 - 再從流對象中拿數據
-
其他功能
獲取請求參數通用方式
方法聲明 功能描述 String getParameter(String name) 根據參數名稱獲取參數值 String[] getParameterValues(String name) 根據參數名稱獲取參數值的數組 Enumeration getParameterNames() 獲取所有請求的參數名稱 Map<String,String[]> getParameterMap() 獲取所有參數的map集合 中文亂碼問題:
- get方式:Tomcat 8 已經將get方式亂碼問題解決了
- post方式:會亂碼
解決:在獲取參數前,設置request
的編碼request.setCharacterEncoding("utf-8")
請求轉發:一種在服務器內部的資源跳轉方式
-
步驟:
-
通過
request
對象獲取請求轉換器對象:RequestDispatcher getRequestDispatcher(String path)
-
使用
RequestDispatcher
對象來進行轉發:forward(ServletRequest request,ServletResponse response)
-
-
特點:
- 瀏覽器地址欄路徑不發生變化
- 只能轉發到當前服務器內部資源中
- 轉發是一次請求
共享數據:
-
域對象:一個有作用範圍的對象,可以在範圍內共享數據
-
request
域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據 -
常用方法:
方法聲明 功能描述 void setAttribute(String name,Object obj) 存儲數據 Object getAttitude(String name) 通過鍵獲取值 void removeAttribute(String name) 通過鍵移除值對 -
獲取
ServletContext
:ServletContext getServletContext()
Response
Response
對象
功能:設置響應消息
-
設置響應行
格式:協議/版本 響應狀態碼 狀態碼描述(HTTP/1.1 200 ok)
設置響應頭:
setStatus(int sc)
-
設置響應頭:
setHeader(String name,String value)
-
設置響應體(使用步驟):
-
獲取輸出流:
字符輸出流:
PrintWriter getWriter()
字節輸出流:
ServletOutputStream getOutputStream()
-
使用輸出流,將數據輸出到客戶端瀏覽器
-
使用案例
完成重定向
重定向:資源跳轉的方式
重定向(redirect)的特點:
- 地址欄發生變化
- 重定向可以訪問其他站點(服務器)的資源
- 重定向是兩次請求(服務器1響應302跳轉到服務器2,服務器2響應200),不能使用
request
對象共享數據
轉發(forward)的特點:
- 轉發地址欄路徑不變
- 轉發只能訪問當前服務器下的資源
- 轉發是一次請求,可以使用
request
對象共享數據
路徑寫法:
- 路徑分類:
相對路徑:通過相對路徑不可以確定唯一資源
規則:找到當前資源和目標資源之間的相對位置
./
:當前目錄../
:後退一級目錄
絕對路徑:通過絕對路徑可以確定唯一資源
- 規則:判斷定義的路徑給誰用的?
- 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)
- 動態獲取虛擬目錄:
request.getContextPath()
- 如:
<a>
、<form>
、重定向……
- 動態獲取虛擬目錄:
- 給服務器使用:不需要加虛擬目錄
- 如:轉發路徑
服務器輸出字符數據到瀏覽器
步驟:
- 獲取字符輸出流
- 輸出數據
解決亂碼問題:
PrintWriter pw = response.getWriter()
- 設置該流的默認編碼
- 告訴瀏覽器響應體使用的編碼,在獲取流之前設置編碼如:
response.setContentType("text/html;charset=utf-8");
服務器輸出字節數據到瀏覽器
實現步驟:
- 獲取字節輸出流
- 輸出數據
驗證碼的作用:
- 本質:圖片
- 目的:防止惡意表單註冊
ServletContext對象
概念:代表整個web應用,可以和程序的容器(服務器)來通信
獲取:
- 通過
request
對象獲取:request.getServletContext();
- 通過
HttpServlet
獲取:this.getServletContext();
注意:兩種獲取方法只有一個ServletContext
對象
功能:
-
獲取MIME類型:
- MIME類型:在互聯網通信過程中定義的一種文件數據類型
格式: 大類型/小類型 text/html - 獲取:
String getMimeType(String file)
- MIME類型:在互聯網通信過程中定義的一種文件數據類型
-
域對象:共享數據
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
ServletContext
對象範圍:所有用戶所有請求的數據 -
獲取文件的真實(服務器)路徑:
String getRealPath(String path)