文章目錄
- 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】
@Override public HttpSessionWrapper getSession() { return getSession(true); }
- 后面用 HttpSessionWrapper 的方法,比如
HttpSessionWrapper#setAttribute(String name, Object value)方法,訪問的就是外部資料源,而不是記憶體中的資料了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/260271.html
標籤:其他
上一篇:js動態添加帶圓圈序號串列
