Springboot中SpringSession儲存到MongoDB
0:session和cookie簡介
session和cookie簡介
由於http協議是無狀態的協議,為了能夠記住請求的狀態,於是引入了Session和Cookie的機制。我們應該有一個很明確的概念,那就是Session是存在於伺服器端的,它是由tomcat管理的,存在於tomcat的記憶體中。而Cookie則是存在於客戶端,更方便理解的說法,可以說存在於瀏覽器。http協議允許從伺服器返回Response時攜帶一些Cookie,並且同一個域下對Cookie的數量有所限制,之前說過Session的持久化依賴於服務端的策略,而Cookie的持久化則是依賴於本地檔案。有一類特殊的Cookie我們需要額外關注,那便是與Session相關的sessionId,他是真正維繫客戶端和服務端的橋樑。
分散式session簡介
由於一般session只存在與單體應用中,當遇到分散式系統時,就會出現session不能共享的問題。這時就需要藉助外部儲存工具,將伺服器上產生的session複製到該外部儲存工具上面,以此實現不同伺服器上共享同一個session,這就叫做分散式session。
下圖是一般單體應用中session的工作原理圖
一般的session工作原理
下圖是分散式session的工作原理圖
spring session工作原理
分散式session的實現思路
核心思路:就是替換掉servlet容器建立和管理session的實現
實現方案:
1.利用Servlet容器提供的外掛功能,自定義HttpSession的建立和管理策略,並通過配置的方式替換掉預設的策略。這方面其實早就有開源專案了,例如memcached-session-manager(目前我們的官方商城都是使用這個),以及tomcat-redis-session-manager。
不過這種方式有個缺點,就是需要耦合Tomcat/Jetty等Servlet容器的程式碼。
2.設計一個Filter,利用HttpServletRequestWrapper,實現自己的 getSession()方法,接管建立和管理Session資料的工作。spring-session就是通過這樣的思路實現的。
3.與其自己寫方法實現造輪子,不如直接使用輪子spring session。
spring session簡介
spring-session是spring旗下的一個專案,把servlet容器實現的httpSession替換為spring-session,專注於解決 session管理問題。可簡單快速且無縫的整合到我們的應用中。
特性
1.輕易把session儲存到第三方儲存容器,框架提供了redis、jvm的map、mongo、gemfire、hazelcast、jdbc等多種儲存session的容器的方式。
2.同一個瀏覽器同一個網站,支援多個session問題。
3.Restful API,不依賴於cookie。可通過header來傳遞jessionID
4.WebSocket和spring-session結合,同步生命週期管理。
spring session原理
spring-session無縫替換應用伺服器的request大概原理是:
1.自定義個Filter,實現doFilter方法
2.繼承 HttpServletRequestWrapper 、HttpServletResponseWrapper 類,重寫getSession等相關方法(在這些方法裡呼叫相關的 session儲存容器操作類)。
3.在 第一步的doFilter中,new 第二步 自定義的request和response的類。並把它們分別傳遞 到 過濾器鏈
4.把該filter配置到 過濾器鏈的第一個位置上
1:配置pom
此處一定要注意<patent>中的version不能過低 否則則會出現專案啟動不成功