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

資訊專欄INFORMATION COLUMN

【API】api 下 session 的 Yes or No?

Y3G / 3059人閱讀

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

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

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

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

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

正文

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

這里要吐槽一下ci框架,奇葩的重寫session機制,搞得我在postman中就是獲取不到session的值,浪費不少時間。所以同志們,選擇框架要慎重?。?/p>

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

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

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

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

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

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

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

轉不過彎來,于是就去查百度,逛論壇,翻來覆去,最后發現一句話很關鍵:API是無狀態的。

對,API是無狀態的,至少 restful 是這樣!

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

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

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

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

本文由 楊成功 原創,更多原創內容請到專欄 楊成功的全棧之路

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23050.html

相關文章

  • Day 15:Meteor —— 從零開始創建一個 Web 應用

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

    Big_fat_cat 評論0 收藏0
  • Day 15:Meteor —— 從零開始創建一個 Web 應用

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

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

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

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

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

    mozillazg 評論0 收藏0

發表評論

0條評論

Y3G

|高級講師

TA的文章

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