【原創】Java基礎之Session機制
Session機制
JSESSIONID是Session的標識,當客戶端請求服務器端的時候,服務器端會檢查是否已經給這個客戶端創建過Session,也就是看客戶端的請求中的header是否有Cookie:JSESSIONID=…,如果客戶端請求包含JSESSIONID,那麽服務器端可以根據JSESSIONID找到對應的Session;如果沒有,則服務端認為該客戶端第一次訪問,會在response中增加header,即Set-Cookie:JSESSIONID=…,當客戶端收到該response後就會被設置Cookie,以後的請求都會攜帶該Cookie,保證Session的一致性;
1 Session機制測試
1.1 模擬第一次訪問(無JSESSION)
1.2 模擬非第一次訪問(有JSESSIONID)
2 分布式Session實現
2.1 偽分布式Session
2.1.1 nginx ip_hash
根據客戶端的IP,將請求分配到不同的服務器上;
配置如下:
upstream my_upstream {
ip_hash;
server 10.20.35.11:8001;
server 10.20.35.11:8002;
}
2.1.2 nginx sticky
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/overview
下載之後通過--add-module重新編譯nginx;
配置如下:
upstream my_upstream{ sticky; server 10.20.35.11:8001; server 10.20.35.11:8002; }
實現原理:
Sticky是nginx的一個模塊,它是基於cookie的一種nginx的負載均衡解決方案,通過分發和識別cookie,來使同一個客戶端的請求落在同一臺服務器上,默認標識名為route
1 客戶端首次發起訪問請求,nginx接收後,發現請求頭沒有cookie,則以輪詢方式將請求分發給後端服務器。
2 後端服務器處理完請求,將響應數據返回給nginx。
3 此時nginx生成帶route的cookie,返回給客戶端。route的值與後端服務器對應,可能是明文,也可能是md5、sha1等Hash值
4 客戶端接收請求,並保存帶route的cookie。
5 當客戶端下一次發送請求時,會帶上route,nginx根據接收到的cookie中的route值,轉發給對應的後端服務器。
2.2 真分布式Session
後端實現:
1 繼承HttpSessionWrapper,比如DistributeHttpSessionWrapper,覆蓋getAttributeNames、getAttribute、setAttribute等方法,改為到一個公共的地方讀寫session屬性,比如DB、Memcached、Redis等;
javax.servlet.http.HttpSession
2 繼承HttpServletRequestWrapper,比如DistributeHttpServletRequestWrapper,覆蓋getSession方法,改為返回DistributeHttpSessionWrapper;
javax.servlet.http.HttpServletRequestWrapper
2 繼承Filter,比如DistributeSessionFilter,覆蓋doFilter方法,在調用鏈中將HttpServletRequest替換為DistributeHttpServletRequestWrapper;
javax.servlet.Filter
【原創】Java基礎之Session機制