【原創】Java基礎之Session機制

Session機制

JSESSIONID是Session的標識,當客戶端請求服務器端的時候,服務器端會檢查是否已經給這個客戶端建立過Session,也就是看客戶端的請求中的header是否有Cookie:JSESSIONID=…,若是客戶端請求包含JSESSIONID,那麼服務器端能夠根據JSESSIONID找到對應的Session;若是沒有,則服務端認爲該客戶端第一次訪問,會在response中增長header,即Set-Cookie:JSESSIONID=…,當客戶端收到該response後就會被設置Cookie,之後的請求都會攜帶該Cookie,保證Session的一致性;java

1 Session機制測試

1.1 模擬第一次訪問(無JSESSION)

 

1.2 模擬非第一次訪問(有JSESSIONID)

 

2 分佈式Session實現

2.1 僞分佈式Session

2.1.1 nginx ip_hash

根據客戶端的IP,將請求分配到不一樣的服務器上;nginx

配置以下:後端

upstream my_upstream {服務器

                ip_hash;cookie

                server 10.20.35.11:8001;
                server 10.20.35.11:8002;
 }session

2.1.2 nginx sticky

https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/overview

下載以後經過--add-module從新編譯nginx;app

配置以下:負載均衡

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的值與後端服務器對應,多是明文,也多是md五、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

相關文章
相關標籤/搜索