1. 程式人生 > 實用技巧 >JavaWeb部分 (Http Request)

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物件的原理

    1. request和response物件是由伺服器建立的。我們來使用它們
    2. request物件是來獲取請求訊息,response物件是來設定響應訊息
  1. 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()
  1. 獲取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()
  1. 獲取客戶機的IP地址:
String getRemoteAddr()

獲取請求頭資料

方法:

String getHeader(String name):通過請求頭的名稱獲取請求頭的值
Enumeration<String> getHeaderNames():獲取所有的請求頭名稱		

獲取請求體資料:
請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求引數
步驟:
1. 獲取流物件

BufferedReader getReader():獲取字元輸入流,只能操作字元資料
ServletInputStream getInputStream():獲取位元組輸入流,可以操作所有型別資料

字元: read ,write
位元組: stream

  1. 再從流物件中拿資料

小技巧:在建立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()