## session共享
session會話在單臺服務器下不會出現共享問題,現在應用部署方式都是分布式,或者集群部署,這樣必然會面臨一個問題,session共享。
## session共享的解決方案
web服務器的粘性請求,比如采用nginx請求分發,使用ip_hash這種負載均衡方式,客戶端請求只會被分發到相同的后臺server,這樣可以避免session共享的問題。但是缺點也很明顯
基于數據庫存儲(網站用戶量大的情況下,頻繁dml數據,對db壓力大)
基于cookie存儲(安全問題、雖然可以加密存儲、但是我覺得永遠不能將敏感數據放在客戶端,不信任啊O(∩_∩)O哈哈~)
服務器內置的session復制域(比如was下提供session復制功能、但這個損耗服務器內存)
基于nosql(memcache、redis都可以)

## HTTP請求是無狀態的
這里要引入一個概念sessionid,session對象當客戶端首次訪問時,創建一個新的session對象.并同時生成一個sessionId,并在此次響應中將sessionId以響應報文的方式寫回客戶端瀏覽器內存(內存cookie)或以重寫url方式送回客戶端,來保持整個會話
也就是說客戶端request請求時候,如果獲取了session,就默認分配一個sessionid,然后通過response響應到客戶端cookie,然后客戶端下一次請求,默認會攜帶這個sessionid請求到服務端,服務端拿到這個sessionid來區分不同的客戶端。
說清楚這些,就可以從sessionid入手了,要實現將session信息存入redis.
參考連接:[使用數據庫保存session](https://www.imooc.com/video/15867)
當登錄成功之后,產生一個token令牌,產生規則的話自己定,一堆密鑰比如系統名字+sessionid+userid+固定字符,產生一個加密的字符串,放入cookie。
這樣當我們獲取當前登錄用戶時,解密token,獲取sessionid,然后取redis用戶信息。。(切記這里不要直接通過sessionid取用戶信息,有風險!!!)
用戶沒有登錄成功,自然也沒有這個令牌。。。
- 簡介
- Cookie
- HTML5 LocalStorage
- session
- 當瀏覽器關閉后,Session就銷毀了嗎?
- mysql數據庫保存session
- HTTP協議的由來
- fsockopen異步請求
- http防盜鏈
- Apache偽靜態知識補充
- 大并發量解決方案
- 大型網站是怎樣解決多用戶高并發訪問
- 網站高并發 大流量訪問的處理及解決方法
- 并發數與在線客戶數?注冊用戶數的關系
- 即時聊天程序
- 反向Ajax實現
- ob緩存作用
- 淺聊并發之戰
- php擴展安裝
- php安裝redis擴展
- SQLMap自動化實施SQL注入共計
- 命名空間namespace
- 集群和分布式之【session共享】
- php Redis存儲Session 【1】
- php Redis存儲Session 【2】
- php mysql存儲session【1】
- php緩存
- 文件緩存
- memcache和redis的比較
- 原生session與session in redis對比
- XSS攻擊【1】
- XSS攻擊【2】
- PHP消息隊列
- php+mysql 模擬發送郵件隊列
- php+mysql 模擬訂單處理隊列
- php+redis 模擬秒殺隊列
- RabbitMQ 消息隊列系統
- beanstalkd
- PHP構建即時通訊
- WebSocket協議
- workerman
- PHP變量的作用域
- PHP傳值和傳引用的區別
- PHP匿名函數
- PHP遞歸函數&應用
- PHP單例模式
- PHP性能優化
- RESTful
- 集群
- 增加pgsql擴展
- php.ini路徑查找
- Swoole Compiler
- mysql 主從
- 主從
- mysql-proxy
- window docker環境