国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【API】api 下 session 的 Yes or No?

Y3G / 3045人閱讀

摘要:對了,在這之前,首先要祝大家端午節(jié)快樂嘎嘎正文切入正題。其實在接入之前,我就有點(diǎn)范嘀咕,客戶端不會拿不到吧果然怕什么來什么,安卓那邊告訴我錯誤,取不到值。和安卓那邊溝通,他們表示框架中可以模擬瀏覽器行為,實現(xiàn)的自動發(fā)送。

寫在前面
時間:2017-05-29  7:30

距離上篇文章發(fā)布已經(jīng)一個多月了,本來自己的計劃是一周一記,怎么就變成月記了呢?最近工作的事情忙的焦頭爛額,當(dāng)然也不能排除我懶的要死的因素,有時間追擇天記怎么就不能寫篇博客呢?暗暗自責(zé)一分鐘...

今天是端午節(jié)小長假的第二天,第一天約好和舍友逛頤和園的計劃被帝都36度的高溫打回來了,于是乎這幫哥們又抱著手機(jī)開黑到深夜。昨天虛度了一天,今兒一早起來雄心滿滿的要繼續(xù)昨天的計劃,無奈這幾個老年人又不起床。我善心作祟,想著打擾人家美夢太不禮貌,那就,寫篇博客吧,理一理一個多月來亂七八糟的事情,要不然,月記也得成年記了。

對了,在這之前,首先要祝大家端午節(jié)快樂!嘎嘎

正文

切入正題。回顧這一個多月亂七八糟的事情,其實就是一個傳統(tǒng)的PHP程序員,拿著一套沒有做用戶登錄狀態(tài)的App接口,在考慮如何利用session建立用戶會話,在接口服務(wù)端保存用戶信息和登錄狀態(tài)。

這里要吐槽一下ci框架,奇葩的重寫session機(jī)制,搞得我在postman中就是獲取不到session的值,浪費(fèi)不少時間。所以同志們,選擇框架要慎重啊!

我拿到的API接口,是沒有做任何請求驗證的,就是任何人拿到接口地址就可以直接調(diào)用,這是極不安全的。我在考慮要做驗證的時候,首先想到的就是傳統(tǒng)的cookie+session機(jī)制。但是一般的API又會在請求參數(shù)或者請求頭中加一個token。所以我的方案是:當(dāng)用戶登錄驗證通過之后,在服務(wù)端session中保存用戶信息和一個與之匹配的token,然后將該token返回客戶端,表示登錄成功。接下來用戶的每一次請求操作,都需要將該token帶到請求頭中。

這樣做相當(dāng)于加了兩層驗證。第一層就是session驗證,傳統(tǒng)的web后臺驗證方式。第二層是將請求頭中token與session中的token匹配,全部通過,才可以去跑接口中的邏輯。

安全性做到了,下面要接客戶端了。其實在接入之前,我就有點(diǎn)范嘀咕,客戶端不會拿不到session吧?果然怕什么來什么,安卓那邊告訴我session錯誤,取不到值。

其實這很正常,web開發(fā)中session用起來簡單快速,那是因為瀏覽器幫我們做了很多事情。比如在session創(chuàng)建的時候,瀏覽器返回的響應(yīng)頭中會有Set-Cookie的選項,幫我們在瀏覽器本地創(chuàng)建cookie來保存上一步session創(chuàng)建時所生成的sessionid,然后下一次請求的時候又會在請求頭中帶上這個cookie,通過 cookie 中的 sessionid 找到對應(yīng)的session數(shù)據(jù)。就好比 session 是一張用戶表,cookie 中的 sessionid 就是用戶表的主鍵 id,瀏覽器獲取 session 數(shù)據(jù)的過程就好比是通過主鍵 ID 查找數(shù)據(jù)表的某條數(shù)據(jù)的過程。

但是在API中,雖然可以接收到響應(yīng)頭中的 set-cookie, 卻不會在下一次的請求頭中自動添加 cookie。沒有發(fā)送sessionid,自然找不到 session 數(shù)據(jù)。所以在API中,發(fā)送請求頭中的cookie,需要我們手動完成。

和安卓那邊溝通,他們表示框架中可以模擬瀏覽器行為,實現(xiàn) cookie 的自動發(fā)送。但是這套接口不光給app用,pc網(wǎng)頁端也在用。如果要在 php curl 請求接口時手動去找 cookie 并發(fā)送,無疑會增加接口的負(fù)重,而且麻煩的很。思慮再三,我們決定放棄這種驗證方式。

我糾結(jié)的是,如果不用session,那么在調(diào)用獲取用戶信息接口的時候,至少要將user_id作為參數(shù)傳過去,但是session模式對于這種方式是不認(rèn)可的,因為用戶信息要在登錄之后從session獲取,而不是通過客戶端直接傳遞,這會有風(fēng)險。同時session最關(guān)鍵的還是保存用戶登錄狀態(tài),如果沒有session,如何知道當(dāng)前用戶是誰?是否在登錄狀態(tài)?是否登錄過期?

轉(zhuǎn)不過彎來,于是就去查百度,逛論壇,翻來覆去,最后發(fā)現(xiàn)一句話很關(guān)鍵:API是無狀態(tài)的。

對,API是無狀態(tài)的,至少 restful 是這樣!

API無狀態(tài),開始不理解,可是它的合理性又在慢慢得到證實。如果api無狀態(tài),那么狀態(tài)只能是存在app客戶端。事實上確是如此,web中用戶狀態(tài)存在服務(wù)器,而app存在客戶端。

還有一種狀況,就是現(xiàn)在流行的前后端分離架構(gòu),用戶狀態(tài)又該存到哪?我記得之前看過相關(guān)的文章,解決方案是在前端與API之間加一個 node 作為中間層。我一直不知道這層 node 是用來干嘛的,不過按照現(xiàn)在理解,這層 node 負(fù)責(zé)請求API,然后創(chuàng)建和維護(hù) session 會話。我就是按照這種方式去做,目前看來是可行的。

所以,扯了這么多,疑問滿滿,牢騷滿滿。如果你覺得web開發(fā)和api開發(fā)的區(qū)別就是前者渲染頁面,后者輸出數(shù)據(jù),那么 session 會是你繞不開的梗。session機(jī)制不是筆試題上表述session和cookie區(qū)別的答案那么弱智,你至少需要補(bǔ)充 http 的知識,理解請求和響應(yīng)。

回到標(biāo)題,api下是否使用session?標(biāo)題的結(jié)尾是個問號,所以自己考慮嘍。如果你沒有session情結(jié),或許,jwt是你更好的選擇。

本文由 楊成功 原創(chuàng),更多原創(chuàng)內(nèi)容請到專欄 楊成功的全棧之路

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23050.html

相關(guān)文章

  • Day 15:Meteor —— 從零開始創(chuàng)建一個 Web 應(yīng)用

    摘要:在我的機(jī)子上,運(yùn)行于端口,以避免和其他默認(rèn)運(yùn)行于端口的沖突。我們可以使用命令連接數(shù)據(jù)庫查看定義應(yīng)用層次創(chuàng)建的模板應(yīng)用有一個問題,客戶端和服務(wù)器段的代碼是一樣的。在中加入然后添加問題模板注意我們使用了來確保用戶未登錄的情況下應(yīng)用。 編者注:我們發(fā)現(xiàn)了有趣的一系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內(nèi)容。 到目前為止我們討論了Bower...

    Big_fat_cat 評論0 收藏0
  • Day 15:Meteor —— 從零開始創(chuàng)建一個 Web 應(yīng)用

    摘要:在我的機(jī)子上,運(yùn)行于端口,以避免和其他默認(rèn)運(yùn)行于端口的沖突。我們可以使用命令連接數(shù)據(jù)庫查看定義應(yīng)用層次創(chuàng)建的模板應(yīng)用有一個問題,客戶端和服務(wù)器段的代碼是一樣的。在中加入然后添加問題模板注意我們使用了來確保用戶未登錄的情況下應(yīng)用。 編者注:我們發(fā)現(xiàn)了有趣的一系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內(nèi)容。 到目前為止我們討論了Bower...

    lpjustdoit 評論0 收藏0
  • HTTPie 官方文檔中文翻譯版

    摘要:目標(biāo)是讓與的交互盡可能的更友好。在版本以上已經(jīng)成為了默認(rèn)的版本。不同類型的鍵值對分割符號分別是。這將會協(xié)商服務(wù)端和你安裝的支持的最高協(xié)議版本。 博客原文? HTTPie 是一個命令行 HTTP 客戶端。目標(biāo)是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個簡單的 http 命令,可以讓我們用簡單自然的表述發(fā)送任意 HTTP 請求,并且可以輸出帶代碼高亮的結(jié)果...

    Baaaan 評論0 收藏0
  • Spring Boot 參考指南(端點(diǎn))

    摘要:在發(fā)出經(jīng)過身份驗證的請求時,被認(rèn)為是端點(diǎn)的輸入,因此不會緩存響應(yīng)。自定義端點(diǎn)對或的操作通過使用或通過自動公開。端點(diǎn)范圍請求范圍請求可以用于請求資源的一部分,當(dāng)使用或時,操作將返回一個自動支持范圍請求的。 50. 端點(diǎn) Actuator端點(diǎn)讓你監(jiān)視和與應(yīng)用程序交互,Spring Boot包含許多內(nèi)置的端點(diǎn),并允許你添加自己的端點(diǎn)。例如,health端點(diǎn)提供基本的應(yīng)用程序健康信息。 可以啟...

    mozillazg 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<