cookie和session的區別和聯系
cookie是本地客戶端用來存儲少量數據信息的,保存在客戶端,用戶能夠很容易的獲取,安全性不高,存儲的數據量小
session是服務器用來存儲部分數據信息,保存在服務器,用戶不容易獲取,安全性高,儲存的數據量相對大,存儲在服務器,會占用一些服務器資源,但是對于它的優點來說,這個缺點可以忽略了
session有什么用
在一次客戶端和服務器為之間的會話中,客戶端(瀏覽器)向服務器發送請求,首先cookie會自動攜帶上次請求存儲的數據(JSESSIONID)到服務器,服務器根據請求參數中的JSESSIONID到服務器中的session庫中查詢是否存在此JSESSIONID的信息,如果存在,那么服務器就知道此用戶是誰,如果不存在,就會創建一個JSESSIONID,并在本次請求結束后將JSESSIONID返回給客戶端,同時將此JSESSIONID在客戶端cookie中進行保存
客戶端和服務器之間是通過http協議進行通信,但是http協議是無狀態的,不同次請求會話是沒有任何關聯的,但是優點是處理速度快
session是一次瀏覽器和服務器的交互的會話,當瀏覽器關閉的時候,會話就結束了,但是會話session還在,默認session是還保留30分鐘的
分布式session一致性
客戶端發送一個請求,經過負載均衡后該請求會被分配到服務器中的其中一個,由于不同服務器含有不同的web服務器(例如Tomcat),不同的web服務器中并不能發現之前web服務器保存的session信息,就會再次生成一個JSESSIONID,之前的狀態就會丟失
4種分布式session解決方案
方案一 客戶端存儲
直接將信息存儲在cookie中
cookie是存儲在客戶端上的一小段數據,客戶端通過http協議和服務器進行cookie交互,通常用來存儲一些不敏感信息
缺點:
- 數據存儲在客戶端,存在安全隱患
- cookie存儲大小、類型存在限制
- 數據存儲在cookie中,如果一次請求cookie過大,會給網絡增加更大的開銷
方案二 session復制
session復制是小型企業應用使用較多的一種服務器集群session管理機制,在真正的開發使用的并不是很多,通過對web服務器(例如Tomcat)進行搭建集群。
存在的問題:
- session同步的原理是在同一個局域網里面通過發送廣播來異步同步session的,一旦服務器多了,并發上來了,session需要同步的數據量就大了,需要將其他服務器上的session全部同步到本服務器上,會帶來一定的網路開銷,在用戶量特別大的時候,會出現內存不足的情況
優點:
- 服務器之間的session信息都是同步的,任何一臺服務器宕機的時候不會影響另外服務器中session的狀態,配置相對簡單
- Tomcat內部已經支持分布式架構開發管理機制,可以對tomcat修改配置來支持session復制,在集群中的幾臺服務器之間同步session對象,使每臺服務器上都保存了所有用戶的session信息,這樣任何一臺本機宕機都不會導致session數據的丟失,而服務器使用session時,也只需要在本機獲取即可
如何配置:
在Tomcat安裝目錄下的config目錄中的server.xml文件中,將注釋打開,tomcat必須在同一個網關內,要不然收不到廣播,同步不了session
在web.xml中開啟session復制:<distributable/>
方案三 session綁定:
Nginx介紹:
Nginx是一款自由的、開源的、高性能的http服務器和反向代理服務器
Nginx能做什么:
反向代理、負載均衡、http服務器(動靜代理)、正向代理
如何使用nginx進行session綁定
我們利用nginx的反向代理和負載均衡,之前是客戶端會被分配到其中一臺服務器進行處理,具體分配到哪臺服務器進行處理還得看服務器的負載均衡算法(輪詢、隨機、ip-hash、權重等),但是我們可以基于nginx的ip-hash策略,可以對客戶端和服務器進行綁定,同一個客戶端就只能訪問該服務器,無論客戶端發送多少次請求都被同一個服務器處理
在nginx安裝目錄下的conf目錄中的nginx.conf文件
upstream aaa {Ip_hash;server 39.105.59.4:8080;Server 39.105.59.4:8081;
}
server {listen 80;server_name www.wanyingjing.cn;#root /usr/local/nginx/html;#index index.html index.htm;location / {proxy_pass http:39.105.59.4;index index.html index.htm;}
}
缺點:
- 容易造成單點故障,如果有一臺服務器宕機,那么該臺服務器上的session信息將會丟失
- 前端不能有負載均衡,如果有,session綁定將會出問題
優點:
- 配置簡單
方案四 基于redis存儲session方案
基于redis存儲session方案流程示意圖
引入pom依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-data-starter-redis</artifactId>
</dependency>
配置redis
#redis數據庫索引(默認是0)
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#默認密碼為空
spring.redis.password=
#連接池最大連接數(負數表示沒有限制)
spring.redis.jedis.pool.max-active=1000
#連接池最大阻塞等待時間(負數表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
#連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=10
#連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=2
#連接超時時間(毫秒)
spring.redis.timeout=500ms
優點:
- 這是企業中使用的最多的一種方式
- spring為我們封裝好了spring-session,直接引入依賴即可
- 數據保存在redis中,無縫接入,不存在任何安全隱患
- redis自身可做集群,搭建主從,同時方便管理
缺點:
- 多了一次網絡調用,web容器需要向redis訪問
總結:
一般會將web容器所在的服務器和redis所在的服務器放在同一個機房,減少網絡開銷,走內網進行連接
---------------------
作者:斷橋殘雪
來源:CSDN
原文:https://blog.csdn.net/qq_35620501/article/details/95047642
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件