瀏覽器是如何將用戶數據發送到伺服器的?

2020-12-20 劉小愛

今天是劉小愛學習Java的第89天。

感謝你的觀看,謝謝你。

話不多說,開始今天的學習:

在學習之前,先思考如下問題:

對於瀏覽器來說:如何將用戶數據發送到伺服器呢?數據傳輸的格式是怎麼樣的呢?對於伺服器來說:如何獲取用戶提交的數據呢?如何將結果響應給瀏覽器?畫一張圖,對其做一個分析:

如果把servlet比作瀏覽器和伺服器之間的一個通道,那麼request和response也就是通道裡的內容。

當然這樣說明肯定不太準確,但是初學這樣更好理解,今天就學一學這個request。

一、get、post請求

在學form表單的時候就知道了請求有get和post之分,當然請求方式不只有這兩個,但目前主要接觸這兩種。

分析下瀏覽器發送請求到伺服器的流程:

①登錄頁面

這是我在網上找的一個bootstrap登錄頁面,其本質也就是一個form表單,只不過加入了美化。

form表單標籤有兩個屬性:

action:也就是表單提交後會跳轉的路徑,我這邊設置的為「/getServlet」method:也就是請求方式,我這邊設置的是get請求。詳情見下圖,模擬post請求時也就可以修改這兩個屬性。

②瀏覽器地址

當點擊登錄提交按鈕後,瀏覽器就會跳轉action中對應的那個路徑。其中get請求:會將參數拼接到url後面。

如何拼接的呢?

input標籤中的name屬性對應的值等於輸入框中輸入的值。

也就是:username=劉小愛。

③註解Servlet開發

使用註解開發的方式創建一個類GetServlet,其路徑為「/getServlet」。

而在①中點擊登錄時會跳轉「/getServlet」,所以會找到這個類,從而執行doGet()請求方法。

瀏覽器抓包觀察請求報文

這邊我又將①中表單請求方式改成post了,主要也是為了將get和post做一個總結對比。

一般是用谷歌瀏覽器,按F12進入開發調試,在Network選項中可以抓包。

①請求行

在get請求中參數是被拼接在url後面的。

而在post請求中是不拼接參數的。

正是因為如此,get請求不可以傳輸數據類較大的或者非文本數據,因為太長了url寫不下了哈哈哈。

②請求頭

以鍵值對的形式將信息傳輸給伺服器。

③請求體

post請求的參數在請求體中,而get請求請求體為空。

二、request請求API

回到最先開始的幾個問題,瀏覽器將數據傳輸給伺服器了。

那麼伺服器如何獲取這些數據呢?又如何進行處理呢?

在Java中一切都是對象,肯定有對應的類和對象。

1Request請求行

①getMethod()方法

其獲取的就是瀏覽器發起的請求方式,例子中是post請求。

②getRequestURI()方法

其獲取的就是瀏覽器訪問的路徑。

③getRemoteAddr()方法

這個是ip值,因為我的是本地電腦,所有就這樣了。

④getProtocol()方法

獲取的協議版本號,這裡是HTTP/1.1。

2Request請求頭

請求頭中的信息是以鍵值對的形式傳送給伺服器的。

其中關於getHeader()方法中的參數:user-agent。

user:瀏覽器攜帶的用戶作業系統。agent:瀏覽器版本等信息。老實說,這裡面的信息就只能看懂一點點。

電腦系統為Win10,64位系統,後面還有能看出是用的谷歌瀏覽器訪問,其它的很多信息暫時不懂。

3Request請求體

①getParameter()方法

parameter,參數的意思。get請求的請求體為空,post請求參數需要從請求體中獲取。

參數名為鍵值對中的鍵,參數值為鍵值對中的值。

這個是一對一的獲取方式。

②getParameterValues()方法

上述的是一個參數名對應一個值,這個是對應多個值,比如複選框就可以選取多個值。

因為我用的是登錄頁面,只有用戶名和密碼。

但對該方法也要有一定的了解,該方法獲取的值是一個數組,使用Arrays類可以將其轉化成字符串再列印。

③getParameterMap()方法

看到Map第一反應就是鍵值對了,Map集合的兩種遍歷方式選擇一種遍歷列印即可。

三、request域對象和轉發

1request域對象

如何理解域對象呢?

前面也說了,servlet相當於管道,request相當於管道裡的內容。

而內容自然是需要裝在容器裡面的,這裡的容器也就是request域對象。

和Java裡的Map集合有一定的類似之處,就連API也很類似。

①setAttribute()

設定值,其中以鍵值對的形式存儲數據。

②getAttribute()

獲取值,根據key值獲取對應的value值。

③removeAttribute()

移除值,刪除對應的鍵值對。

以上就是幾個常用的API,和Java中的集合很相似。

2request轉發

什麼叫轉發呢?

通俗地理解就是:根據瀏覽器的路徑,對應的servlet要處理請求,但是這個servlet不想處理,就可以轉發給另一個servlet來處理。

像極了我小時候遇到不喜歡吃的菜了,就給我爸媽吃的樣子……

舉一個例子來說明:

根據瀏覽器中的路徑,本來ForwardServlet要處理請求,但是它將請求轉發給OtherServlet了,最後就由OtherServlet來處理。

那如何使用轉發?其對應API為:

getRequestDispatcher("/otherServlet"),參數即為需要轉發到的路徑。forward(),參數也就是請求和響應。轉發小結

例子中的轉發是轉發到了另一個Servlet,其實也可以轉發到一個固定靜態頁面。無論轉發多少次,瀏覽器請求路徑沒有變化,對瀏覽器來說就只有一次請求。所以轉發屬於伺服器內部的跳轉行為,與瀏覽器無關。轉發過程中數據是共享的,也就是存儲在域對象中的數據。最後

謝謝你的觀看。

如果可以的話,麻煩幫忙點個讚,謝謝你。

相關焦點

  • 如何發送HTML表單數據
    客戶端:定義如何發送數據 <form>元素能夠定義其數據如何被發送,它所有的特性都是為了在用戶點擊發送按鈕時,讓你配置要發送的請求。其中最重要的兩個特性是action和method。 action特性 該特性定義了數據會被發往何處,它的值必須是個合法的URL。若該特性未指定,則數據會發送到包含該表單的頁面所在的URL。
  • 小米被指私自收集用戶瀏覽器數據
    MIUI 12中新增加了「匿名面具」功能,在用戶不想授予應用某個權限但是又想正常使用這個應用的時候,這個功能就顯得尤其實用;增加了詳細記錄應用的敏感行為、提醒用戶應用正在錄音/攝像/定位等的「照明彈」功能……
  • 如何將瀏覽器上的數據,提交到伺服器?
    表單的作用就是將數據提交給伺服器,至於其具體是如何提交的,暫時還不清楚,後續會學習到。在我們現實生活中也挺常見的,有時會使用到的註冊頁面就可以理解成一個表單。表單由三個部分組成:1表單標籤包含了處理表單數據所用CGI程序的URL以及數據提交到伺服器的方法。 也就是對應form表單中的兩個屬性:action和method。
  • 第三方Cookie遭瀏覽器廠商棄用 用戶數據爭奪戰或有新形態
    由於HTTP協議是無狀態的,用戶所訪問的伺服器沒辦法記錄用戶的上一步操作。因此,用戶第一次訪問伺服器時,會生成一個Session ID來標識用戶並保存信息,相當於是客戶端的身份證,具備唯一性。伺服器端生成Session ID,並結合用戶的使用狀態,形成一段文本發送給用戶端(User-Agent,一般是瀏覽器),瀏覽器會將這段文本保存到某個目錄下的文本文件內,這就是Cookie。
  • SAP系統和微信集成的系列教程之九:如何將微信用戶發送給微信公眾...
    (4) 如何將SAP C4C主數據變化推送給微信公眾號(5) 如何將SAP UI5應用嵌入到微信公眾號菜單中(6) 如何通過OAuth2獲取微信用戶信息並顯示在SAP UI5應用中(7) 使用Redis存儲微信用戶和公眾號的對話記錄(8) 100行代碼在微信公眾號裡集成地圖搜索功能(9) 如何將微信用戶發送到微信公眾號的消息保存到
  • 黑客如何破解你的網站Web伺服器?
    在本文中,我們將向您介紹toweb伺服器黑客技術以及如何保護伺服器免受此類攻擊。拒絕服務攻擊 - 通過此類攻擊,Web伺服器可能會崩潰或對合法用戶不可用。域名系統劫持 -使用此類攻擊者,DNS設置將更改為指向攻擊者的Web伺服器。應該發送到Web伺服器的所有流量都被重定向到錯誤的流量。
  • Java網絡編程——發送HTTP請求到伺服器
    當Java程序需要向伺服器發送請求或讀取伺服器數據時,使用URLConnection類是比較好的選擇。URLConnection類封裝了與伺服器互動操作的方法,通過它可以建立與伺服器的遠程連接,檢查伺服器資源的屬性,向伺服器發送請求並接收伺服器返回的數據。
  • 瀏覽器在Angular 5中推送通知
    有時,推送通知也稱為伺服器推送通知,因為推送通知是從設備上的應用程式傳遞的,而不需要客戶端的任何特定請求。基本上,這是拉通知和推送通知之間的基本區別:對於拉通知,客戶端必須向伺服器發送信息請求,而推送通知伺服器向客戶端發送信息,而不從客戶端收到任何請求。實際上,最終用戶必須選擇接受警報,最終用戶需要在安裝應用程式或啟動應用程式時接受該設置。
  • 代碼顯示:Chrome 瀏覽器可能會發送通知提醒用戶使用該軟體
    根據外國科技媒體 9to5google 的報導,他們通過閱讀 Chromium 近期合併的代碼發現,谷歌正準備嘗試從 Android 版 Chrome 入手,重新爭取回由 Chrome 遷移至其他瀏覽器的用戶。
  • 利用郵箱伺服器發送電子郵件
    第三節 利用其他郵箱伺服器發送電子郵件在第一和第二節中,我講解了如何實現利用EXCEL屬性設置完成郵件的發送,但很多時候,我們並不是喜歡用OUTLOOK來發送郵件,你可能用的是126的郵箱,可能用的是163的郵箱,等等,那麼如何實現利用這些郵件伺服器來發送郵件呢?我們這節的內容就給大家以很好的解決方案。
  • python定時獲取天氣數據並自動發送到郵箱
    自動發送郵件,python幾行代碼來搞定!我們說到如何用python來實現自動發送郵件。這篇文章我們就來談談如何獲取天氣數據,並定時將天氣數據發送到指定的郵箱中?1.Requests庫這裡我們用到一個新的庫--requests,它是一個http庫,簡單來說就是用來向伺服器發起請求的庫。它在python內置模塊的基礎上進行了高度的封裝,從而使得python進行網絡請求時,變得人性化,使用Requests可以輕而易舉地完成瀏覽器可有的任何操作。
  • 小米瀏覽器隱私爭議——可能涉及多款手機及瀏覽器
    根據最新的《福布斯》報告,小米正在從其用戶中收集大量瀏覽數據。儘管小米的默認瀏覽器似乎記錄了用戶訪問的每個網站,但製造商表示這並沒有任何異常。當檢查Redmi Note 8上的Mi Browser時,網絡安全研究人員Gabi Cirlig發現,即使將其設置為私有或「隱身」模式,它仍在跟蹤許多用戶行為。根據Cirlig的說法,收集到的數據包括訪問過的網站,在小米新聞提要中查看的項目以及搜尋引擎查詢。除此之外,還有更多的驚喜,不僅是小米上預裝的瀏覽器有問題。
  • Zoom移除會將用戶數據發送給Facebook的代碼
    據外媒報導, 當地時間周五,視頻會議軟體Zoom對其iOS應用進行了更新從而停止向Facebook發送某些數據。 此前,該應用被發現會將用戶何時打開應用、他們所處時區、城市和設備細節等信息發送給社交網絡巨頭Facebook。
  • php獲取web伺服器數據的快捷方法:post和get的區別與聯繫
    但是,在人人都離不開網際網路的時代,你知道網際網路是如何通過代碼獲取web伺服器上的數據嗎?下面,就來聊聊網際網路獲取數據的常用方法——get和post方法。這兩種方法都可以獲取web伺服器上的數據。不過,他們既有相同點,也有不同點。下面我們一起來看看這兩種方法的詳細情況吧。
  • 【乾貨分享】如何使用代理伺服器上Facebook
    (ProxyServer)是網上提供轉接功能的伺服器,在一般情況下,我們使用網絡瀏覽器直接去連接其他Internet站點取得網絡信息時,是直接聯繫到目的站點伺服器,然後由目的站點伺服器把信息傳送回來。代理伺服器是介於客戶端和Web伺服器之間的另一臺伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器發出請求,信號會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的信息並傳送給你的瀏覽器。
  • JAVA伺服器推送功能設計,消息方法總結|java|伺服器|客戶端|推送...
    (一)設計和思路介紹客戶端可能通過自定義的協議,或者是app應用,需要跟推送伺服器建立一個連接,推和拉的區別是推是伺服器主動像客戶端發起請求,往往這個技術很難實現的,主動推數據需要建立一條網絡通道,伺服器才可以完成推送,不說它也不知道是哪個客戶端,一定是客戶端主動和推送伺服器建立了連接socket,一般的情況是通過拉的模式來完成推送,涉及到一些socket的技術點
  • 如何保護隱私之瀏覽器Cookie的防範
    在文章《如何保護隱私之關於軟體和服務的選擇》主要介紹了選擇"軟體"和"服務"的一般性原則。從《如何保護隱私之瀏覽器如何導致隱私洩漏》中我們了解了瀏覽器洩露隱私的幾個原因,那麼具體的該如何保護隱私呢?本文將從瀏覽器Cookie的防範說起,助你加強隱私防護。★什麼是"cookie"?
  • 如何將數據中心的數據傳輸到微軟Azure
    微軟Azure採用策略的核心是採用混合雲橋接本地數據中心和雲計算的理念。用戶不需要淘汰原有的伺服器。與之相反,用戶可以將它們連接到公共雲,以利用公共雲的規模和服務,並將其視為現有數據中心的擴展。通過公共網際網路連接到Azure將一個VPN設置到Azure就像將一個IPSec VPN設置到任何其他網絡上,就像配置連接到分支機構或災難恢復服務一樣。用戶需要獲得微軟公司允許的供應商的VPN設備,以便在其終端提供到VPN連接的網關,並在Azure虛擬網絡中設置Azure VPN網關。
  • 用Scala實現簡單的Web和API伺服器
    關於如何將消息持久存儲到資料庫中,我將在以後的文章中介紹。接下來,我們需要讓頁面底部的兩個input支持交互。本文的最後一節將介紹怎樣讓所有人立即看到你的消息,而不需要手動刷新。利用Websockets實時更新頁面推送更新的概念和簡單:每次提交新消息後,就將消息」推送"到所有監聽中的瀏覽器上,而不是等待瀏覽器刷新並「拉取」更新後的數據。實現這一目的有多種方法。本文我們使用Websockets。
  • 作為前端,你真的了解你的瀏覽器嗎?
    在Chrome瀏覽器中,地址欄也是搜索輸入欄位,因此UI線程需要解析並決定是將您發送到搜尋引擎還是請求的網站。 這樣,如果一切按照預期進行,則當網絡線程接收數據時,渲染器進程已經處於備用位置。如果導航重定向跨站點,則可能不會使用此備用過程,在這種情況下,可能需要其他過程。 步驟5:提交導航 現在已經準備好數據和渲染器進程,將IPC從瀏覽器進程發送到渲染器進程以提交導航。他還會傳遞數據流,因此渲染器進程可以繼續接收HTML數據。