日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Session - 源码解读

發布時間:2025/3/21 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 - 源码解读的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。