日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

程序员过关斩将--Http请求中如何保持状态?

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员过关斩将--Http请求中如何保持状态? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信搜一搜

架構(gòu)師修行之路

這是一個(gè)被無(wú)數(shù)程序員擼過(guò)的問(wèn)題,卻只有少數(shù)人了解了真相。大體上搜了一下,網(wǎng)上關(guān)于http協(xié)議保持狀態(tài)誤導(dǎo)大家的文章還是有的,比如:有人說(shuō)利用ViewState,那是asp.net下獨(dú)有的東西,請(qǐng)注明“asp.net下如何保持狀態(tài)”!!

關(guān)于用戶認(rèn)證方案可以查看以前的文章:

程序員過(guò)關(guān)斬將--cookie和session的關(guān)系其實(shí)很簡(jiǎn)單

程序員過(guò)關(guān)斬將--互聯(lián)網(wǎng)人必備知識(shí)cookie和session認(rèn)證

程序員過(guò)關(guān)斬將--更加優(yōu)雅的Token認(rèn)證方式JWT

01

PART

Http協(xié)議

http協(xié)議相對(duì)我們的年齡來(lái)說(shuō),是一個(gè)比較古老的協(xié)議,它的誕生之初是為了能讓人們?cè)诨ヂ?lián)網(wǎng)的領(lǐng)域自由沖浪。到了現(xiàn)代,http協(xié)議不謙虛的講,已經(jīng)成為了分布式網(wǎng)絡(luò)的基礎(chǔ)之一,從最初的1.0版本到現(xiàn)在的2.0乃至研發(fā)中的3.0,它在分布式通信領(lǐng)域已經(jīng)越來(lái)越重要。

無(wú)論http協(xié)議什么樣的文章,都需要把http大體說(shuō)上一下,這里就簡(jiǎn)單啰嗦幾句

http協(xié)議在報(bào)文的編碼方式上采用了文本方式,通信上采用客戶端到服務(wù)器的請(qǐng)求-響應(yīng)方式。

http協(xié)議是基于tcp協(xié)議之上的應(yīng)用層協(xié)議,所以它的傳輸速度注定會(huì)收到tcp協(xié)議的約束。有人說(shuō)http協(xié)議采用文本協(xié)議是一個(gè)天大的錯(cuò)誤,我不這么認(rèn)為,首先在http協(xié)議被發(fā)明之初,可供的選擇并不多,在當(dāng)時(shí)看來(lái),文本協(xié)議已經(jīng)是比較好的選擇了。其次,文本協(xié)議除了在傳輸性能上比二進(jìn)制方式差一些,其他都還好,尤其是在數(shù)據(jù)的直觀性上,很容易被我們理解。尤其是程序員,在看到http的請(qǐng)求和返回文本內(nèi)容的時(shí)候,就可以大體猜出很多東西。

在我看來(lái),http最大的缺陷在于交互中的設(shè)計(jì),換句話說(shuō),http的狀態(tài)保持問(wèn)題,才是在我們平時(shí)開(kāi)發(fā)中面臨的最大問(wèn)題。http天生是無(wú)狀態(tài)的,但這并不意味著不能解決。

為什么我們要保持狀態(tài)呢?根本原因在于現(xiàn)在的互聯(lián)網(wǎng)的交互需求。什么是保持狀態(tài)呢?通俗來(lái)講,客戶端發(fā)起的http請(qǐng)求,服務(wù)端需要知道來(lái)自于哪個(gè)客戶端。設(shè)想,如果沒(méi)有狀態(tài),當(dāng)你逛淘寶的時(shí)候,剁手下了單,服務(wù)器怎么知道是你下的單呢?如果把你的單發(fā)給別人,你是不是要去罵娘了呢?

說(shuō)到http保持狀態(tài),我有一點(diǎn)要聲明,http和瀏覽器是有區(qū)別的,瀏覽器只不過(guò)是利用http協(xié)議來(lái)進(jìn)行通信,有不少同學(xué)一提到http協(xié)議,就以瀏覽器來(lái)舉例,這個(gè)是不健全的

http協(xié)議要想保持狀態(tài),無(wú)非就是利用http協(xié)議本身定義的那些屬性來(lái)實(shí)現(xiàn)。比如:Header,Body ......只要服務(wù)器能識(shí)別,理論上就可以作為保持狀態(tài)的憑據(jù)

02

PART

參數(shù)保持狀態(tài)

http保持狀態(tài)最簡(jiǎn)單并且最粗暴的莫過(guò)于直接采用參數(shù)了。服務(wù)器把參數(shù)憑據(jù)通過(guò)http協(xié)議下發(fā)給客戶端,客戶端無(wú)論存儲(chǔ)到哪,只要下次請(qǐng)求把這個(gè)參數(shù)攜帶上,服務(wù)器就可以根據(jù)約定讀取相應(yīng)的參數(shù)來(lái)進(jìn)行識(shí)別。

這種方式目前大多數(shù)用來(lái)保持那些非敏感信息,比如最常見(jiàn)的分頁(yè)參數(shù)

https://www.cnblogs.com/#p2

有人會(huì)有疑問(wèn)?分頁(yè)參數(shù)也算是狀態(tài)嗎?雖然大多數(shù)的文章中所說(shuō)的狀態(tài)是指用戶的登錄狀態(tài),但是從狀態(tài)的抽象定義上來(lái)看,分頁(yè)也算是一種狀態(tài)的定義。而用戶身份狀態(tài)的保持,由于涉及到隱私,一般不會(huì)采用url參數(shù)的方式來(lái)維持。

03

PART

Cookie保持狀態(tài)

Cookie是http請(qǐng)求中header中的一個(gè)屬性,它保存在客戶端。

很多文章里,都說(shuō)Cookie是服務(wù)端下發(fā)給客戶端的,你們這樣說(shuō)是不是不太好?Cookie本質(zhì)是上客戶端的東西,客戶端不能自己創(chuàng)建Cookie嗎?客戶端當(dāng)然可以自己創(chuàng)建Cookie!!只不過(guò)在用戶進(jìn)行認(rèn)證的流程中,標(biāo)識(shí)用戶身份的cookie是服務(wù)器下發(fā)的,所以在介紹Cookie本身定義的時(shí)候請(qǐng)不要誤導(dǎo)別人。

利用Cookie來(lái)保持http的狀態(tài)是現(xiàn)在很常見(jiàn)的解決方案,其中的一個(gè)原因是:在瀏覽器中沒(méi)有跨域的情況下,瀏覽器會(huì)在http請(qǐng)求中自動(dòng)攜帶cookie,非常方便。在非瀏覽器環(huán)境中,可能需要寫(xiě)代碼來(lái)保證每次都攜帶對(duì)應(yīng)的cookie。

服務(wù)端在接收到http請(qǐng)求,解析對(duì)應(yīng)的cookie即可得到需要保持的狀態(tài)標(biāo)識(shí)。說(shuō)到服務(wù)端,不少人提到了session會(huì)保持http狀態(tài),這是不是又不太好了,首先session本質(zhì)上是一個(gè)抽象的概念,其次我們平時(shí)所說(shuō)的用戶信息等session是屬于服務(wù)端的kv數(shù)據(jù),不同的客戶端可以識(shí)別不同的session本質(zhì)上也是通過(guò)cookie機(jī)制來(lái)實(shí)現(xiàn),我認(rèn)為那些說(shuō)session可以保持http狀態(tài)的說(shuō)法是不明確的。

04

PART

還有其他嗎?

除了以上兩種方式還有其他方式可以保持http的請(qǐng)求狀態(tài)嗎?當(dāng)然有!!

http狀態(tài)的保持需要客戶端和服務(wù)端同時(shí)協(xié)作來(lái)保證,如果客戶端上傳了cookie,但是服務(wù)端不能正常解析,這也算不上狀態(tài)的保持。理論上服務(wù)端只要能識(shí)別http請(qǐng)求中攜帶的某些數(shù)據(jù),就能達(dá)到保持狀態(tài)的目的。

在瀏覽器中,受限于每個(gè)瀏覽器的功能,瀏覽器發(fā)送一個(gè)http請(qǐng)求,自動(dòng)攜帶的只有規(guī)定的那些header和body數(shù)據(jù),而多數(shù)header只能攜帶協(xié)議規(guī)定的那些固定值,這也是瀏覽器中要想保持http狀態(tài)方案少的原因之一。body一般用在post的http請(qǐng)求中,所以它的應(yīng)用場(chǎng)景是有限的。

關(guān)于http的header的屬性有很多,有興趣的同學(xué)可以去研究一下。這里提及一個(gè)“Authorization”,從字面意思就可以知道它和認(rèn)證相關(guān),當(dāng)我們要保持http請(qǐng)求中用戶的登錄狀態(tài)時(shí)候可以用此字段。那保持其他狀態(tài)是否可以用呢?當(dāng)然可以,header中的那些值本質(zhì)上對(duì)于服務(wù)端來(lái)說(shuō)就是kv數(shù)據(jù),這些數(shù)據(jù)用于什么用途,每個(gè)業(yè)務(wù)都可以靈活控制。比如:通常情況下,“Authorization”這個(gè)header用于用戶認(rèn)證,那我可不可以用于識(shí)別是A頁(yè)面還是B頁(yè)面呢,當(dāng)然可以,只要客戶端在不同的頁(yè)面上傳不同的“Authorization”值,然后服務(wù)端去識(shí)別這些值就可以了。

從來(lái)沒(méi)有人說(shuō)過(guò)http協(xié)議只能用于客戶端和服務(wù)端。服務(wù)端和服務(wù)端通信同樣能夠使用http協(xié)議,而且現(xiàn)在很多分布式系統(tǒng)都是這樣來(lái)通信的。至于服務(wù)端和服務(wù)端通信,那http協(xié)議保持狀態(tài)就更加靈活了(這里針對(duì)瀏覽器來(lái)比較),請(qǐng)求方和接受方可以約定任意的header頭來(lái)標(biāo)識(shí)狀態(tài),這還要得益于http協(xié)議header頭可以自定義的特性。比如:如果喜歡“XXOO”,完全可以采用“XXOO”的header來(lái)標(biāo)識(shí)狀態(tài)

Accept:?application/json Accept-Encoding:?gzip,?deflate,?br Accept-Language:? . . . XXOO:10次/天

05

PART

寫(xiě)在最后

每個(gè)問(wèn)題的解決方案有很多,沒(méi)有完美的方案,只有最適合業(yè)務(wù)場(chǎng)景的方案。認(rèn)清技術(shù)的本質(zhì),才是我們提高自身技能的捷徑。能力有限,技術(shù)無(wú)限,歡迎批評(píng)指正!

●程序員修神之路--為什么我會(huì)了SOA,你們還要逼我學(xué)微服務(wù)?

●程序員過(guò)關(guān)斬將--數(shù)據(jù)庫(kù)的樂(lè)觀鎖和悲觀鎖并非真實(shí)的鎖

●程序員修神之路--設(shè)計(jì)一套R(shí)PC框架并非易事

●程序員過(guò)關(guān)斬將--要想獲取我的用戶信息,就得按照規(guī)矩來(lái)

●程序員過(guò)關(guān)斬將--更加優(yōu)雅的Token認(rèn)證方式JWT

●程序員過(guò)關(guān)斬將--cookie和session的關(guān)系其實(shí)很簡(jiǎn)單

●程序員修神之路--用NOSql給高并發(fā)系統(tǒng)加速

●程序員修神之路--高并發(fā)系統(tǒng)設(shè)計(jì)負(fù)載均衡架構(gòu)

●程序員過(guò)關(guān)斬將--你為什么還在用存儲(chǔ)過(guò)程?

●程序員修神之路--問(wèn)世間異步為何物?

●程序員修神之路--提高網(wǎng)站的吞吐

總結(jié)

以上是生活随笔為你收集整理的程序员过关斩将--Http请求中如何保持状态?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。