JavaWeb部分 (Http Request)
寫在前面:分享技術,共同進步,有不足請見諒,相關意見可評論告知
程式設計路漫漫,學習無止盡!
目錄
HTTP
前言
概念:Hyper Text Transfer Protocol 超文字傳輸協議
傳輸協議:定義了,客戶端和伺服器端通訊時,傳送資料的格式
特點:
1. 基於TCP/IP的高階協議
2. 預設埠號:80
3. 基於請求/響應模型的:一次請求對應一次響應
4. 無狀態的:每次請求之間相互獨立,不能互動資料
* 歷史版本: * 1.0:每一次請求響應都會建立新的連線 * 1.1:複用連線
請求訊息資料格式
——
1. 請求行
請求方式 請求url 請求協議/版本
GET /login.html HTTP/1.1
——
請求方式:
HTTP協議有7中請求方式,常用的有2種
GET:
1. 請求引數在請求行中,在url後。
2. 請求的url長度有限制的
3. 不太安全
POST:
1. 請求引數在請求體中
2. 請求的url長度沒有限制的
3. 相對安全
請求頭:客戶端瀏覽器告訴伺服器一些資訊
請求頭名稱: 請求頭值
構造post請求表單
**常見的請求頭**: 1. User-Agent:瀏覽器告訴伺服器,我訪問你使用的瀏覽器版本資訊 * 可以在伺服器端獲取該頭的資訊,解決瀏覽器的相容性問題 2. Referer:http://localhost/login.html * 告訴伺服器,我(當前請求)從哪裡來? * 作用: 1. 防盜鏈: 2. 統計工作:
_ 盜鏈情形:
**
**
請求空行
空行,就是用於分割POST請求的請求頭,和請求體的。
請求體(正文):
封裝POST請求訊息的請求引數的(get請求沒有請求體)
字串格式: POST /login.html HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://localhost/login.html Connection: keep-alive Upgrade-Insecure-Requests: 1 username=zhangsan
Request
request物件和response物件的原理
-
- request和response物件是由伺服器建立的。我們來使用它們
- request物件是來獲取請求訊息,response物件是來設定響應訊息
- request物件繼承體系結構:
ServletRequest -- 介面
| 繼承
HttpServletRequest -- 介面
| 實現
org.apache.catalina.connector.RequestFacade 類(tomcat)
request功能:
——
獲取請求訊息資料, 獲取請求行資料
GET /day14/demo1?name=zhangsan HTTP/1.1
day14 虛擬路徑 後面請求資源(請求引數)
方法:
1. 獲取請求方式 :GET
String getMethod()
2. 獲取虛擬目錄:/day14
String getContextPath()
- 獲取Servlet路徑: /demo1
String getServletPath()
4.、獲取get方式請求引數:name=zhangsan
String getQueryString()
5. 獲取請求URI:/day14/demo1
String getRequestURI(): /day14/demo1
StringBuffer getRequestURL() :http://localhost/day14/demo1
URL:統一資源定位符 : http://localhost/day14/demo1 中華人民共和國
URI統一資源識別符號 : /day14/demo1 共和國
範圍: URI > URL
6. 獲取協議及版本:HTTP/1.1
實列:
String getProtocol()
- 獲取客戶機的IP地址:
String getRemoteAddr()
獲取請求頭資料
方法:
String getHeader(String name):通過請求頭的名稱獲取請求頭的值
Enumeration<String> getHeaderNames():獲取所有的請求頭名稱
獲取請求體資料:
請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求引數
步驟:
1. 獲取流物件
BufferedReader getReader():獲取字元輸入流,只能操作字元資料
ServletInputStream getInputStream():獲取位元組輸入流,可以操作所有型別資料
字元: read ,write
位元組: stream
- 再從流物件中拿資料
小技巧:在建立servlet時可以如下,
優點:如下注釋,自動寫訪問註解路徑
·防盜鏈程式碼實現:
其他功能:
獲取請求引數通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求引數
String getParameter(String name):
根據引數名稱獲取引數值 username=zs&password=123
String[] getParameterValues(String name):
根據引數名稱獲取引數值的陣列 hobby=xx&hobby=game
Enumeration<String> getParameterNames():
獲取所有請求的引數名稱
Map<String,String[]> getParameterMap():
獲取所有引數的map集合
中文亂碼問題:
get方式:tomcat 8 已經將get方式亂碼問題解決了
post方式:會亂碼
解決:在獲取引數前,設定request的編碼request.setCharacterEncoding("utf-8");
請求轉發一種在伺服器內部的資源跳轉方式
步驟:
通過request物件獲取請求轉發器物件:RequestDispatchergetRequestDispatcher(String path)
使用RequestDispatcher物件來進行轉發:forward(ServletRequest request, ServletResponse response)
特點:
1. 瀏覽器位址列路徑不發生變化
2. 只能轉發到當前伺服器內部資源中。
3. 轉發是一次請求
資料共享
域物件:一個有作用範圍的物件,可以在範圍內共享資料
request域: 代表一次請求的範圍,一般用於請求轉發的多個資源中共享資料
方法:
void setAttribute(String name,Object obj); 儲存資料
Object getAttribute(String name); 通過鍵獲取取值
void removeAttribute(String name); 通過鍵移除鍵值對
獲取ServletContext
ServletContext getServletContext()