今天就跟大家聊聊有關(guān)Spring Session redis 在不同服務間共享 Session 時的類共享方案的示例分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡程序員、網(wǎng)頁設計師等,應用各種網(wǎng)絡程序開發(fā)技術(shù)和網(wǎng)頁設計技術(shù)配合操作的協(xié)同工作。成都創(chuàng)新互聯(lián)專業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設計、成都外貿(mào)網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站制作(企業(yè)站、自適應網(wǎng)站建設、電商門戶網(wǎng)站)等服務,從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!
當在多服務之間使用 Spring Session Redis 進行 Session 共享要非常小心,因為它很不安全,很有可能導致整個服務實例不可用,無法處理任何請求。其中比較危險的地方就是在進行序列化,反序列化的時候(這種類型的錯誤尤其容易在沒有開發(fā)規(guī)范的團隊內(nèi)發(fā)生,就是什么樣的數(shù)據(jù)可以往共享存儲里面存,什么樣的不能存。存的時候要以什么樣的格式去存,這些都要有規(guī)定才比較安全。因為共享存儲是會影響到別人的不僅僅是為了自己的服務用起來方便)。RedisSerializer 接口的實現(xiàn)都是在序列化和反序列化出錯的時候直接拋出異常從而導致整個請求錯誤。
public interface RedisSerializer<T> { /** * Serialize the given object to binary data. * * @param t object to serialize * @return the equivalent binary data */ byte[] serialize(T t) throws SerializationException; /** * Deserialize an object from the given binary data. * * @param bytes object binary representation * @return the equivalent object instance */ T deserialize(byte[] bytes) throws SerializationException; }
下面用一張圖來說明我遇到的問題。Spring Session 的誕生老實說并不是為了分布式系統(tǒng),而是為集群系統(tǒng)提供了一種 Session 解決方案。但是我們把 Spring Session 用在了分布式系統(tǒng)上用以解決 Session 共享的問題老實說本身就是有點難為人家 Spring Session 了 。
Spring Session 實現(xiàn) Session 共享的大致原理如下圖所示 , 使用一個 Filter 來攔截所有請求,在攔截到請求之后對 HttpServletRequest 和 HttpServletResponse 進行包裝 (HttpServletRequestWrapper , HttpServletResponseWrapper)。在包裝中對 session 進行控制 ,將 session 數(shù)據(jù)都存儲在第三方存儲當中。
在了解了 Spring Session 的工作原理后再去考慮這個問題就有頭緒了 。還是通過圖形的方式來做大概的說明。
學習 Spring Session 的 SessionRepositoryFilter 的實現(xiàn)方式 , 添加一個 Filter 順序在 SessionRepositoryFilter 之后 , 在攔截過程中包裝 HttpServletRequest , 重寫 getSession(boolean create) 和 getSession() 方法, 自定義一個 SafetyHttpSessionWrapper 包裝 Session ,重寫 setAttribute(String name , Object value) 函數(shù) , 在保存屬性成功后利用 redis 的發(fā)布訂閱機制發(fā)送消息到 redis , 消息的內(nèi)容為所保存對象的 .class 文件數(shù)據(jù)。在消息訂閱端 , 接收到消息后利用 javassist 和 net.bytebuddy.dynamic.loading.ByteArrayClassLoader 將 .class 文件數(shù)據(jù)加載轉(zhuǎn)換成 Class 的實例對象,但是這個 Class 實例的范圍被限定在 ByteArrayClassLoader 中 , 而這個 ByteArrayClassLoader 是提供給 RedisSerializer 內(nèi)部使用的 , 比如 JdkSerializationRedisSerializer , GenericJackson2JsonRedisSerializer 都需要使用到 ClassLoader 。這樣當 服務A 在存儲任何自定義的對象在 Session 中時, 訪問服務 B 也不會出現(xiàn)讀取 Session 反序列化 ClassNotFoundException 的錯誤了。
看完上述內(nèi)容,你們對Spring Session Redis 在不同服務間共享 Session 時的類共享方案的示例分析有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
網(wǎng)站標題:SpringSessionRedis在不同服務間共享Session時的類共享方案的示例分析
網(wǎng)頁URL:http://muchs.cn/article2/igedic.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、服務器托管、域名注冊、網(wǎng)頁設計公司、微信公眾號、響應式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)