javascript
Spring Session - 源码解读
文章目錄
- Spring Session 流程圖
- 源碼分析
Spring Session 流程圖
Spring Session 主要是利用過濾器,偷梁換柱,實現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 是訪問外部數據源的操作類,例如說訪問 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);// 繼續執行下一個過濾器try {filterChain.doFilter(wrappedRequest, wrappedResponse);} finally {// 請求結束,提交 Session 到外部數據源wrappedRequest.commitSession();}}該SessionRepositoryFilter過濾器覆蓋了原來servlet中的request和response接口中定義的操作session方法,替換成自己的session方法.
在過濾的時候,總是會執行一個finally語句塊,在finally中提交session,保存到Redis session以hash結構存放在 redis , 默認的過期時間30分鐘 .
-
調用 SessionRepositoryRequestWrapper#getSession() 方法時,返回的是自己封裝的 HttpSessionWrapper 對象
【SessionRepositoryFilter#SessionRepositoryRequestWrapper.java】
@Overridepublic HttpSessionWrapper getSession() {return getSession(true);}
- 后面用 HttpSessionWrapper 的方法,比如HttpSessionWrapper#setAttribute(String name, Object value) 方法,訪問的就是外部數據源,而不是內存中的數據了。
總結
以上是生活随笔為你收集整理的Spring Session - 源码解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Session - 使用S
- 下一篇: Redis - Spring Data