javascript
Spring Session - 源码解读
文章目錄
- Spring Session 流程圖
- 源碼分析
Spring Session 流程圖
Spring Session 主要是利用過濾器,偷梁換柱,實現(xiàn)session儲存無感知的切換。
源碼分析
-
頁面請求被全局的過濾器org.springframework.web.filter.DelegatingFilterProxy過濾
-
Spring Session 提供了 SessionRepositoryFilter 過濾器,它會過濾請求時,將請求 HttpServletRequest 對象包裝成 SessionRepositoryRequestWrapper 對象
【SessionRepositoryFilter.java】
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {// sessionRepository 是訪問外部數(shù)據(jù)源的操作類,例如說訪問 Redis、MySQL 等等request.setAttribute(SESSION_REPOSITORY_ATTR, this.sessionRepository);// 將請求和響應進行包裝成 SessionRepositoryRequestWrapper 和 SessionRepositoryResponseWrapper 對象SessionRepositoryFilter<S>.SessionRepositoryRequestWrapper wrappedRequest = new SessionRepositoryFilter.SessionRepositoryRequestWrapper(request, response, this.servletContext);SessionRepositoryFilter.SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryFilter.SessionRepositoryResponseWrapper(wrappedRequest, response);// 繼續(xù)執(zhí)行下一個過濾器try {filterChain.doFilter(wrappedRequest, wrappedResponse);} finally {// 請求結(jié)束,提交 Session 到外部數(shù)據(jù)源wrappedRequest.commitSession();}}該SessionRepositoryFilter過濾器覆蓋了原來servlet中的request和response接口中定義的操作session方法,替換成自己的session方法.
在過濾的時候,總是會執(zhí)行一個finally語句塊,在finally中提交session,保存到Redis session以hash結(jié)構(gòu)存放在 redis , 默認的過期時間30分鐘 .
-
調(diào)用 SessionRepositoryRequestWrapper#getSession() 方法時,返回的是自己封裝的 HttpSessionWrapper 對象
【SessionRepositoryFilter#SessionRepositoryRequestWrapper.java】
@Overridepublic HttpSessionWrapper getSession() {return getSession(true);}
- 后面用 HttpSessionWrapper 的方法,比如HttpSessionWrapper#setAttribute(String name, Object value) 方法,訪問的就是外部數(shù)據(jù)源,而不是內(nèi)存中的數(shù)據(jù)了。
總結(jié)
以上是生活随笔為你收集整理的Spring Session - 源码解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Session - 使用S
- 下一篇: Redis - Spring Data