亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

實現(xiàn)Session共享的系統(tǒng)、方法、服務器和集群設備與流程

文檔序號:12493560閱讀:246來源:國知局
實現(xiàn)Session共享的系統(tǒng)、方法、服務器和集群設備與流程

本發(fā)明實施例涉及但不限于智能終端技術,尤指一種實現(xiàn)會話(Session)共享的系統(tǒng)、方法、服務器和集群設備。



背景技術:

隨著互聯(lián)網(wǎng)的日益壯大,網(wǎng)站的頁面瀏覽量(PV,Page View)和獨立訪客(UV,Unique Visitor)成線性或者指數(shù)倍的增加,因此,單服務器單數(shù)據(jù)庫早已經(jīng)不能滿足實際需求。目前,大多數(shù)大型網(wǎng)站的服務器都采用了分布式服務的部署方式,解決大并發(fā)、大數(shù)據(jù)量造成的瓶頸問題。目前,有關于分布式Session數(shù)據(jù)的共享基本上都是基于Memcached服務器的,其中,Memcached本質上是一個內存緩存系統(tǒng)。因此,如果發(fā)生網(wǎng)絡故障或是Memcached服務器宕機,則存儲在這臺Memcached服務器上的所有Session數(shù)據(jù)都將不可訪問,并且由于Session數(shù)據(jù)是存儲在內存中的,一旦重啟Memcached服務器,就會導致Session數(shù)據(jù)全部丟失。



技術實現(xiàn)要素:

本申請?zhí)峁┝艘环N實現(xiàn)會話(Session)共享的系統(tǒng)、方法、服務器和集群設備,能夠提升Session數(shù)據(jù)的安全性。

為了達到本申請目的,本發(fā)明實施例提供了一種實現(xiàn)會話Session共享的系統(tǒng),包括:一個或多個服務器和集群設備;集群設備包括一個主用處理器和多個輔助處理器;其中,

服務器,用于接收到客戶端發(fā)送的用戶請求,判斷該用戶請求攜帶的cookie中是否存在第一會話標識SessionID;當判斷出用戶請求攜帶的cookie中存在第一SessionID時,在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù);判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù);當判斷出查找到的第一Session數(shù)據(jù)是無效數(shù)據(jù)時,則向主用處理器發(fā)送第一通知;接收到主用處理器發(fā)送的通知,為與所述用戶請求對應的Session創(chuàng)建第二SessionID,并向主用處理器發(fā)送第二通知;

主用處理器,用于接收到服務器發(fā)送的第一通知,根據(jù)第一通知刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù);通知服務器創(chuàng)建與用戶請求對應的第二SessionID;接收到服務器發(fā)送的第二通知,根據(jù)第二通知在本地第一存儲單元中對應存儲與用戶請求對應的第二Session數(shù)據(jù)和第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中;

輔助處理器,用于預先對應存儲第一SessionID和與第一SessionID對應的第一Session數(shù)據(jù);對應存儲主用處理器同步過來的第二Session數(shù)據(jù)和第二SessionID。

可選地,所述服務器,還用于當判斷出所述用戶請求攜帶的cookie中不存在所述第一SessionID時,為與所述用戶請求對應的Session創(chuàng)建第三SessionID作為所述第一SessionID;向所述主用處理器發(fā)送第三通知;相應地,

所述主用處理器,還用于接收到服務器發(fā)送的所述第三通知,在所述本地第一存儲單元中對應存儲與所述用戶請求對應的第三Session數(shù)據(jù)和所述第一SessionID,并且將對應存儲的所述第三Session數(shù)據(jù)和所述第一SessionID同步至多個輔助處理器中;相應地,

所述輔助處理器,還用于對應存儲所述主用處理器同步過來的所述第三Session數(shù)據(jù)和所述第一SessionID。

可選地,所述服務器中用于在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù)包括:根據(jù)所述第一SessionID判斷本地內存區(qū)域中是否有所述第一Session數(shù)據(jù);當判斷出所述本地內存區(qū)域中有所述第一Session數(shù)據(jù),從所述本地內存區(qū)域中讀取所述第一Session數(shù)據(jù);當判斷出所述本地內存區(qū)域中沒有所述第一Session數(shù)據(jù),向所述主用處理器發(fā)送第四通知;從所述本地內存區(qū)域中讀取所述第一Session數(shù)據(jù);相應地,

所述主用處理器,還用于接收到所述服務器發(fā)送的所述第四通知,查找與所述第一SessionID對應的Session數(shù)據(jù);將查找到的Session數(shù)據(jù)同步至所述本地內存區(qū)域中。

可選地,所述主用處理器中用于查找與所述第一SessionID對應存儲的Session數(shù)據(jù)包括:在所述多個輔助處理器中確定滿足預設條件的一個輔助處理器并通知滿足所述預設條件的一個輔助處理器;接收來自所述滿足所述預設條件的一個輔助處理器發(fā)送的查找到的與所述第一SessionID對應存儲的Session數(shù)據(jù)并將接收到的所述Session數(shù)據(jù)作為與所述第一SessionID對應的Session數(shù)據(jù);相應地,

所述滿足所述預設條件的一個輔助處理器,用于在本地第二存儲單元中查找與所述第一SessionID對應存儲的Session數(shù)據(jù);將查找到的與所述第一SessionID對應存儲的Session數(shù)據(jù)發(fā)送給所述主用處理器。

可選地,所述服務器,還用于當判斷出查找到的所述第一Session數(shù)據(jù)是有效數(shù)據(jù)時,向所述主用處理器發(fā)送第五通知;相應地,

所述主用處理器,還用于接收到所述服務器發(fā)送的所述第五通知,更新自身、所述本地內存區(qū)域以及每個輔助處理器中存儲的所述第一Session數(shù)據(jù)中的最后訪問時間。

可選地,所述服務器中用于判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù)包括:

獲取當前時間;

計算獲得的當前時間和所述第一Session數(shù)據(jù)中的最后訪問時間之間的差值;

判斷所述差值是否大于預設時長閾值;

當判斷出所述差值大于預設時長閾值,判斷出所述第一Session數(shù)據(jù)是無效數(shù)據(jù);

當判斷出所述差值小于或等于預設時長閾值,判斷出所述第一Session數(shù)據(jù)是有效數(shù)據(jù)。

可選地,所述服務器,還用于在所述為與所述用戶請求對應的Session創(chuàng)建第二SessionID之后,將創(chuàng)建的所述第二SessionID作為所述第一SessionID存儲至所述cookie中并將存儲了所述第一SessionID的cookie返回給用戶。

本發(fā)明實施例還提供了一種實現(xiàn)會話Session共享的方法,包括:

主用處理器接收到服務器發(fā)送的第一通知,根據(jù)所述第一通知刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的該第一會話標識SessionID和與該第一SessionID對應的第一Session數(shù)據(jù),并通知服務器創(chuàng)建與用戶請求對應的第二SessionID;

主用處理器接收到服務器發(fā)送的第二通知,根據(jù)所述第二通知在本地第一存儲單元中對應存儲與用戶請求對應的第二Session數(shù)據(jù)和第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中。

可選地,在所述主用處理器接收到服務器發(fā)送的第一通知之前,該方法還包括:

所述服務器接收到客戶端發(fā)送的用戶請求,判斷該用戶請求攜帶的cookie中是存在所述第一SessionID;

當判斷出用戶請求攜帶的cookie中存在第一SessionID時,所述服務器在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù);

所述服務器判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù);當判斷出查找到的第一Session數(shù)據(jù)是無效數(shù)據(jù)時,則向主用處理器發(fā)送所述第一通知;

所述服務器接收到主用處理器發(fā)送的通知,為與該用戶請求對應的Session創(chuàng)建第二SessionID,并向主用處理器發(fā)送所述第二通知。

可選地,當所述服務器判斷出所述用戶請求攜帶的cookie中不存在所述第一SessionID時,該方法還包括:

所述服務器為與所述用戶請求對應的Session創(chuàng)建第三SessionID作為所述第一SessionID;向所述主用處理器發(fā)送第三通知;

所述主用處理器接收到服務器發(fā)送的所述第三通知,在所述本地第一存儲單元中對應存儲與所述用戶請求對應的第三Session數(shù)據(jù)和所述第一SessionID,并且將對應存儲的所述第三Session數(shù)據(jù)和所述第一SessionID同步至多個輔助處理器中。

可選地,所述服務器在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù)包括:

所述服務器根據(jù)所述第一SessionID判斷本地內存區(qū)域中是否有所述第一Session數(shù)據(jù);當判斷出所述本地內存區(qū)域中有所述第一Session數(shù)據(jù),所述服務器從所述本地內存區(qū)域中讀取所述第一Session數(shù)據(jù);

當判斷出所述本地內存區(qū)域中沒有所述第一Session數(shù)據(jù),所述服務器向所述主用處理器發(fā)送第四通知;從所述本地內存區(qū)域中讀取所述第一Session數(shù)據(jù);所述主用處理器接收到所述服務器發(fā)送的所述第四通知,查找與所述第一SessionID對應的Session數(shù)據(jù);將查找到的Session數(shù)據(jù)同步至所述本地內存區(qū)域中;所述服務器從所述本地內存區(qū)域中讀取同步過來的所述Session數(shù)據(jù)。

可選地,所述主用處理器查找與所述第一SessionID對應存儲的Session數(shù)據(jù)包括:

所述主用處理器在所述多個輔助處理器中確定滿足預設條件的一個輔助處理器并通知滿足所述預設條件的一個輔助處理器;

所述滿足所述預設條件的一個輔助處理器在本地第二存儲單元中查找與所述第一SessionID對應存儲的Session數(shù)據(jù);將查找到的與所述第一SessionID對應存儲的Session數(shù)據(jù)發(fā)送給所述主用處理器;

所述主用處理器接收來自所述滿足所述預設條件的一個輔助處理器發(fā)送的查找到的與所述第一SessionID對應存儲的Session數(shù)據(jù)并將接收到的所述Session數(shù)據(jù)作為與所述第一SessionID對應的Session數(shù)據(jù)。

可選地,當所述服務器判斷出查找到的所述第一Session數(shù)據(jù)是有效數(shù)據(jù)時,該方法還包括:所述服務器向所述主用處理器發(fā)送第五通知;所述主用處理器接收到所述服務器發(fā)送的所述第五通知,更新自身、所述本地內存區(qū)域以及每個輔助處理器中存儲的所述第一Session數(shù)據(jù)中的最后訪問時間。

可選地,所述服務器判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù)包括:

所述服務器獲取當前時間;

所述服務器計算獲得的當前時間和所述第一Session數(shù)據(jù)中的最后訪問時間之間的差值;

所述服務器判斷所述差值是否大于預設時長閾值;

當判斷出所述差值大于預設時長閾值,所述服務器判斷出所述第一Session數(shù)據(jù)是無效數(shù)據(jù);

當判斷出所述差值小于或等于預設時長閾值,所述服務器判斷出所述第一Session數(shù)據(jù)是有效數(shù)據(jù)。

可選地,在所述為與所述用戶請求對應的Session創(chuàng)建第二SessionID之后,該方法還包括:所述服務器將創(chuàng)建的所述第二SessionID作為所述第一SessionID存儲至所述cookie中并將存儲了所述第一SessionID的cookie返回給用戶。

本發(fā)明實施例還提供了一種服務器,包括:收發(fā)模塊、判斷模塊、查找模塊和創(chuàng)建模塊;其中,

收發(fā)模塊,用于接收到客戶端發(fā)送的用戶請求;接收到判斷模塊發(fā)送的通知,則向主用處理器發(fā)送第一通知;接收來自主用處理器的通知,通知創(chuàng)建模塊;接收到創(chuàng)建模塊發(fā)送的通知,向主用處理器發(fā)送第二通知;

判斷模塊,用于判斷該用戶請求攜帶的cookie中是否存在第一會話標識SessionID;當判斷出用戶請求攜帶的cookie中存在第一SessionID時,通知查找模塊;判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù);當判斷出查找到的第一Session數(shù)據(jù)是無效數(shù)據(jù)時,通知收發(fā)模塊;

查找模塊,用于在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù);

創(chuàng)建模塊,用于接收到收發(fā)模塊發(fā)送的通知,為與該用戶請求對應的Session創(chuàng)建第二SessionID;通知收發(fā)模塊向主用處理器發(fā)送第二通知。

可選地,所述判斷模塊,還用于當判斷出所述用戶請求攜帶的cookie中不存在所述第一SessionID時,通知所述創(chuàng)建模塊;相應地,

所述創(chuàng)建模塊,還用于接收到所述判斷模塊發(fā)送的通知,為與所述用戶請求對應的Session創(chuàng)建第三SessionID作為所述第一SessionID;通知所述收發(fā)模塊向所述主用處理器發(fā)送第三通知;相應地,

所述收發(fā)模塊,還用于向所述主用處理器發(fā)送所述第三通知。

可選地,所述查找模塊具體用于:根據(jù)所述第一SessionID判斷本地內存區(qū)域中是否有所述第一Session數(shù)據(jù);當判斷出所述本地內存區(qū)域中有所述第一Session數(shù)據(jù),從所述本地內存區(qū)域中讀取所述第一Session數(shù)據(jù);當判斷出所述本地內存區(qū)域中沒有所述第一Session數(shù)據(jù),通知所述收發(fā)模塊向所述主用處理器發(fā)送第四通知;從所述本地內存區(qū)域中讀取所述第一Session數(shù)據(jù)。

可選地,所述判斷模塊,還用于當判斷出查找到的所述第一Session數(shù)據(jù)是有效數(shù)據(jù)時,通知所述收發(fā)模塊向所述主用處理器發(fā)送第五通知;相應地,

所述收發(fā)模塊,還用于接收到所述判斷模塊發(fā)送的通知,向所述主用處理器發(fā)送第五通知。

可選地,所述判斷模塊中用于判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù)包括:

獲取當前時間;

計算獲得的當前時間和所述第一Session數(shù)據(jù)中的最后訪問時間之間的差值;

判斷所述差值是否大于預設時長閾值;

當判斷出所述差值大于預設時長閾值,判斷出所述第一Session數(shù)據(jù)是無效數(shù)據(jù);

當判斷出所述差值小于或等于預設時長閾值,判斷出所述第一Session數(shù)據(jù)是有效數(shù)據(jù)。

可選地,所述收發(fā)模塊,還用于將創(chuàng)建的所述第二SessionID作為所述第一SessionID存儲至所述cookie中并將存儲了所述第一SessionID的cookie返回給用戶。

本發(fā)明實施例還提供了一種集群設備,包括:一個主用處理器和多個輔助處理器;其中,

主用處理器,用于接收到服務器發(fā)送的第一通知,刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的該第一會話標識SessionID和與該第一SessionID對應的第一Session數(shù)據(jù);通知服務器;接收到服務器發(fā)送的第二通知,在本地第一存儲單元中對應存儲與該用戶請求對應的第二Session數(shù)據(jù)和該第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中;

輔助處理器,用于預先對應存儲該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù);對應存儲主用處理器同步過來的第二Session數(shù)據(jù)和第二SessionID。

可選地,所述主用處理器,還用于接收到服務器發(fā)送的所述第三通知,在本地第一存儲單元中對應存儲與所述用戶請求對應的第三Session數(shù)據(jù)和所述第一SessionID,并且將對應存儲的所述第三Session數(shù)據(jù)和所述第一SessionID同步至多個輔助處理器中;相應地,

所述輔助處理器,還用于對應存儲所述主用處理器同步過來的所述第三Session數(shù)據(jù)和所述第一SessionID。

可選地,所述主用處理器,還用于接收到所述服務器發(fā)送的所述第四通知,查找與所述第一SessionID對應的Session數(shù)據(jù);將查找到的Session數(shù)據(jù)同步至所述本地內存區(qū)域中。

可選地,所述主用處理器中用于查找與所述第一SessionID對應存儲的Session數(shù)據(jù)包括:在所述多個輔助處理器中確定滿足預設條件的一個輔助處理器并通知滿足所述預設條件的一個輔助處理器;接收來自所述滿足所述預設條件的一個輔助處理器發(fā)送的查找到的與所述第一SessionID對應存儲的Session數(shù)據(jù)并將接收到的所述Session數(shù)據(jù)作為與所述第一SessionID對應的Session數(shù)據(jù);相應地,

所述滿足所述預設條件的一個輔助處理器,用于在本地第二存儲單元中查找與所述第一SessionID對應存儲的Session數(shù)據(jù);將查找到的與所述第一SessionID對應存儲的Session數(shù)據(jù)發(fā)送給所述主用處理器。

可選地,所述主用處理器,還用于接收到所述服務器發(fā)送的所述第五通知,更新自身、所述本地內存區(qū)域以及每個輔助處理器中存儲的所述第一Session數(shù)據(jù)中的最后訪問時間。

本發(fā)明實施例包括:主用處理器接收到服務器發(fā)送的第一通知,根據(jù)所述第一通知刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的第一會話標識SessionID和與該第一SessionID對應的第一Session數(shù)據(jù),并通知服務器創(chuàng)建與用戶請求對應的第二SessionID;主用處理器接收到所述服務器發(fā)送的第二通知,根據(jù)所述第二通知在本地第一存儲單元中對應存儲與用戶請求對應的第二Session數(shù)據(jù)和第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中。本發(fā)明實施例提升了Session數(shù)據(jù)的安全性。

附圖說明

此處所說明的附圖用來提供對本發(fā)明的進一步理解,構成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構成對本發(fā)明的不當限定。在附圖中:

圖1為本申請實現(xiàn)Session共享的系統(tǒng)的架構圖;

圖2為本申請實現(xiàn)Session共享的方法的流程圖;

圖3為本申請實現(xiàn)Session共享的方法的實施例的流程圖;

圖4為本申請服務器的結構示意圖;

圖5為本申請集群設備的結構示意圖。

具體實施方式

為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚明白,下文中將結合附圖對本發(fā)明的實施例進行詳細說明。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互任意組合。

圖1為本申請實現(xiàn)Session共享的系統(tǒng)的架構圖,如圖1所示,包括:一個或多個服務器和集群設備;集群設備包括一個主用處理器和多個輔助處理器。其中,

服務器,用于接收到客戶端發(fā)送的用戶請求,判斷該用戶請求攜帶的cookie中是否存在第一會話標識(SessionID);當判斷出用戶請求攜帶的cookie中存在第一SessionID時,在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù);判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù);當判斷出查找到的第一Session數(shù)據(jù)是無效數(shù)據(jù)時,則向主用處理器發(fā)送第一通知;接收到主用處理器發(fā)送的通知,為與該用戶請求對應的Session創(chuàng)建第二SessionID,并向主用處理器發(fā)送第二通知。

其中,cookie是指某些網(wǎng)站為了辨別用戶身份、進行Session跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)。

主用處理器,用于接收到服務器發(fā)送的第一通知,根據(jù)第一通知刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù);通知服務器創(chuàng)建與用戶請求對應的第二SessionID;接收到服務器發(fā)送的第二通知,根據(jù)第二通知在本地第一存儲單元中對應存儲與該用戶請求對應的第二Session數(shù)據(jù)和該第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中。

其中,本地第一存儲單元可以是主用處理器的自身的硬盤。

輔助處理器,用于預先對應存儲該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù);對應存儲主用處理器同步過來的第二Session數(shù)據(jù)和第二SessionID。

其中,輔助處理器中預先對應存儲的該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù)是由主用處理器同步過來的數(shù)據(jù)。

可選地,服務器,還用于當判斷出用戶請求攜帶的cookie中不存在第一SessionID時,為與用戶請求對應的Session創(chuàng)建第三SessionID作為第一SessionID;向主用處理器發(fā)送第三通知;相應地,

主用處理器,還用于接收到服務器發(fā)送的第三通知,在本地第一存儲單元中對應存儲與用戶請求對應的第三Session數(shù)據(jù)和第一SessionID,并且將對應存儲的第三Session數(shù)據(jù)和第一SessionID同步至多個輔助處理器中;相應地,

輔助處理器,還用于對應存儲主用處理器同步過來的第三Session數(shù)據(jù)和第一SessionID。

其中,服務器中用于在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù)包括:根據(jù)第一SessionID判斷本地內存區(qū)域中是否有第一Session數(shù)據(jù);當判斷出本地內存區(qū)域中有第一Session數(shù)據(jù),從本地內存區(qū)域中讀取第一Session數(shù)據(jù);當判斷出本地內存區(qū)域中沒有第一Session數(shù)據(jù),向主用處理器發(fā)送第四通知;從本地內存區(qū)域中讀取第一Session數(shù)據(jù);相應地,

主用處理器,還用于接收到服務器發(fā)送的第四通知,查找與第一SessionID對應的Session數(shù)據(jù);將查找到的Session數(shù)據(jù)同步至本地內存區(qū)域中。

其中,主用處理器中用于查找與第一SessionID對應存儲的Session數(shù)據(jù)包括:在多個輔助處理器中確定滿足預設條件的一個輔助處理器并通知滿足預設條件的一個輔助處理器;接收來自滿足預設條件的一個輔助處理器發(fā)送的查找到的與第一SessionID對應存儲的Session數(shù)據(jù)并將接收到的Session數(shù)據(jù)作為與第一SessionID對應的Session數(shù)據(jù);相應地,

滿足預設條件的一個輔助處理器,用于在本地第二存儲單元中查找與第一SessionID對應存儲的Session數(shù)據(jù);將查找到的與第一SessionID對應存儲的Session數(shù)據(jù)發(fā)送給主用處理器。

其中,本地第二存儲單元可以是滿足預設條件的一個輔助處理器的自身的硬盤。

其中,預設條件包括:當前處理的進程數(shù)最少,或者配置最高,或者資源利用率最低等等。

可選地,服務器,還用于當判斷出查找到的第一Session數(shù)據(jù)是有效數(shù)據(jù)時,向主用處理器發(fā)送第五通知;相應地,

主用處理器,還用于接收到服務器發(fā)送的第五通知,更新自身、本地內存區(qū)域以及每個輔助處理器中存儲的第一Session數(shù)據(jù)中的最后訪問時間。

其中,服務器中用于判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù)包括:

獲取當前時間;

計算獲得的當前時間和第一Session數(shù)據(jù)中的最后訪問時間之間的差值;

判斷差值是否大于預設時長閾值;

當判斷出差值大于預設時長閾值,判斷出第一Session數(shù)據(jù)是無效數(shù)據(jù);

當判斷出差值小于或等于預設時長閾值,判斷出第一Session數(shù)據(jù)是有效數(shù)據(jù)。

可選地,服務器,還用于在為與用戶請求對應的Session創(chuàng)建第二SessionID之后,將創(chuàng)建的第二SessionID作為第一SessionID存儲至cookie中并將存儲了第一SessionID的cookie返回給用戶。

需要說明的是,將SessionID存儲至cookie中屬于本領域技術人員所熟知的慣用技術手段,此處不再贅述,并不用來限制本申請。

可選地,輔助處理器,還用于當主用處理器宕機時,通過選舉算法在自身及其它輔助處理器中選取一個輔助處理器作為主用處理器。

可選地,主用處理器和多個輔助處理器的總數(shù)量是奇數(shù)。

需要說明的是,集群設備中的每一個處理器(主用處理器或輔助處理器)都相當于一個節(jié)點,也即相當于一個選民,它們都有自己的推薦人(自己或其它處理器),比如,最開始它們都推薦自己,而誰更適合成為Leader(領導者或主用處理器)有一個簡單的規(guī)則,例如配置足夠大、持有的數(shù)據(jù)夠新等等;每個選民都告訴其它選民自己目前的推薦人是誰,當選民發(fā)現(xiàn)有比自己更適合的選民時就轉而推薦這個更適合的選民;最后,大部選民意見一致時,就可以結束選舉,從而確定出主用處理器。

可選地,上述多個服務器可以是Memcached服務器,其中,Memcached是一套分布式的高速緩存系統(tǒng)。

圖2為本申請實現(xiàn)會話(Session)共享的方法的流程圖,如圖2所示,包括:

步驟201:主用處理器接收到服務器發(fā)送的第一通知,根據(jù)第一通知刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的該第一會話標識(SessionID)和與該第一SessionID對應的第一Session數(shù)據(jù),并通知服務器創(chuàng)建與用戶請求對應的第二SessionID。

可選地,在主用處理器接收到服務器發(fā)送的第一通知之前,該方法還包括:

服務器接收到客戶端發(fā)送的用戶請求,判斷該用戶請求攜帶的cookie中是否存在第一SessionID;

當判斷出用戶請求攜帶的cookie中存在第一SessionID時,服務器在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù);

服務器判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù);當判斷出查找到的第一Session數(shù)據(jù)是無效數(shù)據(jù)時,則向主用處理器發(fā)送第一通知;相應地,

服務器接收到主用處理器發(fā)送的通知,為與該用戶請求對應的Session創(chuàng)建第二SessionID,并向主用處理器發(fā)送第二通知。可選地,在服務器為與用戶請求對應的Session創(chuàng)建第二SessionID之后,該方法還包括:服務器將創(chuàng)建的第二SessionID作為第一SessionID存儲至cookie中并將存儲了第一SessionID的cookie返回給用戶。

其中,服務器在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù)包括:

服務器根據(jù)第一SessionID判斷本地內存區(qū)域中是否有第一Session數(shù)據(jù);當判斷出本地內存區(qū)域中有第一Session數(shù)據(jù),服務器從本地內存區(qū)域中讀取第一Session數(shù)據(jù);

當判斷出本地內存區(qū)域中沒有第一Session數(shù)據(jù),服務器向主用處理器發(fā)送第四通知;從本地內存區(qū)域中讀取第一Session數(shù)據(jù);主用處理器接收到服務器發(fā)送的第四通知,查找與第一SessionID對應的Session數(shù)據(jù);將查找到的Session數(shù)據(jù)同步至本地內存區(qū)域中;服務器從本地內存區(qū)域中讀取同步過來的Session數(shù)據(jù)。

可選地,當服務器判斷出用戶請求攜帶的cookie中不存在第一SessionID時,該方法還包括:

服務器為與用戶請求對應的Session創(chuàng)建第三SessionID作為第一SessionID;向主用處理器發(fā)送第三通知;

主用處理器接收到服務器發(fā)送的第三通知,在本地第一存儲單元中對應存儲與用戶請求對應的第三Session數(shù)據(jù)和第一SessionID,并且將對應存儲的第三Session數(shù)據(jù)和第一SessionID同步至多個輔助處理器中。

其中,輔助處理器中對應存儲有主用處理器同步過來的第三Session數(shù)據(jù)和第一SessionID。

其中,主用處理器查找與第一SessionID對應存儲的Session數(shù)據(jù)包括:

主用處理器在多個輔助處理器中確定滿足預設條件的一個輔助處理器并通知滿足預設條件的一個輔助處理器;

滿足預設條件的一個輔助處理器在本地第二存儲單元中查找與第一SessionID對應存儲的Session數(shù)據(jù);將查找到的與第一SessionID對應存儲的Session數(shù)據(jù)發(fā)送給主用處理器;

主用處理器接收來自滿足預設條件的一個輔助處理器發(fā)送的查找到的與第一SessionID對應存儲的Session數(shù)據(jù)并將接收到的Session數(shù)據(jù)作為與第一SessionID對應的Session數(shù)據(jù)。

其中,本地第二存儲單元是指輔助處理器自身的硬盤。其中,一個輔助處理器有一個硬盤。

其中,預設條件包括:當前處理的進程數(shù)最少,或者配置最高,或者資源利用率最低等等。

可選地,當服務器判斷出查找到的第一Session數(shù)據(jù)是有效數(shù)據(jù)時,該方法還包括:服務器向主用處理器發(fā)送第五通知;主用處理器接收到服務器發(fā)送的第五通知,更新自身、本地內存區(qū)域以及每個輔助處理器中存儲的第一Session數(shù)據(jù)中的最后訪問時間。

其中,服務器判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù)包括:

服務器獲取當前時間;

服務器計算獲得的當前時間和第一Session數(shù)據(jù)中的最后訪問時間之間的差值;

服務器判斷差值是否大于預設時長閾值;

當判斷出差值大于預設時長閾值,服務器判斷出第一Session數(shù)據(jù)是無效數(shù)據(jù);

當判斷出差值小于或等于預設時長閾值,服務器判斷出第一Session數(shù)據(jù)是有效數(shù)據(jù)。

步驟202:主用處理器接收到服務器發(fā)送的第二通知,根據(jù)第二通知在本地第一存儲單元中對應存儲與該用戶請求對應的第二Session數(shù)據(jù)和該第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中。

其中,本地第一存儲單元是指主用處理器自身的硬盤。

可選地,當主用處理器宕機時,該方法還包括:多個輔助處理器通過選舉算法在自身及其它輔助處理器中選取一個輔助處理器作為主用處理器。

需要說明的是,每一個處理器(主用處理器或輔助處理器)都相當于一個節(jié)點,也即相當于一個選民,它們都有自己的推薦人(自己或其它處理器),比如,最開始它們都推薦自己,而誰更適合成為Leader(領導者或主用處理器)有一個簡單的規(guī)則,例如配置足夠大、持有的數(shù)據(jù)夠新等等;每個選民都告訴其它選民自己目前的推薦人是誰,當選民發(fā)現(xiàn)有比自己更適合的選民時就轉而推薦這個更適合的選民;最后,大部選民意見一致時,就可以結束選舉,從而確定出主用處理器。

可選地,主用處理器和多個輔助處理器的總數(shù)量是奇數(shù)。

可選地,上述多個服務器可以是Memcached服務器,其中,Memcached是一套分布式的高速緩存系統(tǒng)。

可選地,該方法之后還包括:服務器根據(jù)讀取的與用戶請求對應的第一Session數(shù)據(jù)對該用戶請求進行處理。

需要說明的是,如何根據(jù)讀取的Session數(shù)據(jù)對用戶請求進行處理屬于本領域技術人員所熟知的慣用技術手段,此處不再贅述,并不用來限制本申請。

需要說明的是,上述中的第一SessionID、第二SessionID和第三SessionID均是可以唯一標識一個會話的身份的,對于同一用戶(或客戶端)而言,第一SessionID、第二SessionID和第三SessionID是在不同時刻或場景標識同一用戶的會話的身份的,因此,在某種意義上,第一SessionID、第二SessionID和第三SessionID是相同的。

需要說明的是,本申請的上述技術方案中,服務器僅僅是對應保存一份SessionID和Session數(shù)據(jù),并不對Session數(shù)據(jù)進行生命周期的管理(如Session數(shù)據(jù)是無效數(shù)據(jù)時,刪除與該Session數(shù)據(jù)相關的一切數(shù)據(jù);又如,當Session由新數(shù)據(jù)產(chǎn)生時,也是將新數(shù)據(jù)更新至對應的Session數(shù)據(jù)中),而是有集群設備中的主用處理器進行生命周期的管理,從而可以提升服務器讀取Session數(shù)據(jù)和對用戶請求進行處理的效率,從而提升了整個系統(tǒng)的系統(tǒng)。

本申請實施方式中,通過主用處理器在本地第一存儲單元中對應存儲與該用戶請求對應的第二Session數(shù)據(jù)和該第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中,從而提升了Session數(shù)據(jù)的安全性。通過服務器在本地內存區(qū)域中讀取Session數(shù)據(jù)對用戶請求進行操作,從而提升了整個系統(tǒng)的性能。

圖3為本申請實現(xiàn)Session共享的方法的實施例的流程圖,如圖3所示,包括:

步驟301:服務器接收到客戶端發(fā)送的用戶請求。

步驟302:服務器判斷該用戶請求攜帶的cookie中是否存在第一會話標識(SessionID)。當判斷出用戶請求攜帶的cookie中存在第一SessionID時,轉入步驟303;否則,轉入步驟309。

步驟303:服務器在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù)。

其中,步驟303具體包括:

服務器根據(jù)第一SessionID判斷本地內存區(qū)域中是否有第一Session數(shù)據(jù);當判斷出本地內存區(qū)域中有第一Session數(shù)據(jù),服務器從本地內存區(qū)域中讀取第一Session數(shù)據(jù);

當判斷出本地內存區(qū)域中沒有第一Session數(shù)據(jù),服務器向主用處理器發(fā)送第四通知;從本地內存區(qū)域中讀取第一Session數(shù)據(jù);主用處理器接收到服務器發(fā)送的第四通知,查找與第一SessionID對應的Session數(shù)據(jù);將查找到的Session數(shù)據(jù)同步至本地內存區(qū)域中;服務器從本地內存區(qū)域中讀取同步過來的Session數(shù)據(jù)。

其中,主用處理器查找與第一SessionID對應存儲的Session數(shù)據(jù)包括:

主用處理器在多個輔助處理器中確定滿足預設條件的一個輔助處理器并通知滿足預設條件的一個輔助處理器;

滿足預設條件的一個輔助處理器在本地第二存儲單元中查找與第一SessionID對應存儲的Session數(shù)據(jù);將查找到的與第一SessionID對應存儲的Session數(shù)據(jù)發(fā)送給主用處理器;

主用處理器接收來自滿足預設條件的一個輔助處理器發(fā)送的查找到的與第一SessionID對應存儲的Session數(shù)據(jù)并將接收到的Session數(shù)據(jù)作為與第一SessionID對應的Session數(shù)據(jù)。

其中,本地第二存儲單元是指輔助處理器自身的硬盤。不同的輔助處理器有不同的本地第二存儲單元,也即一個輔助處理器對應一個本地第二存儲單元。

其中,預設條件包括:當前處理的進程數(shù)最少,或者配置最高,或者資源利用率最低等等。

步驟304:服務器判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù)。當判斷出查找到的第一Session數(shù)據(jù)是無效數(shù)據(jù)時,轉入步驟305;否則,轉入步驟311。

其中,步驟304具體包括:

服務器獲取當前時間;

服務器計算獲得的當前時間和第一Session數(shù)據(jù)中的最后訪問時間之間的差值;

服務器判斷差值是否大于預設時長閾值;

當判斷出差值大于預設時長閾值,服務器判斷出第一Session數(shù)據(jù)是無效數(shù)據(jù);

當判斷出差值小于或等于預設時長閾值,服務器判斷出第一Session數(shù)據(jù)是有效數(shù)據(jù)。

步驟305:服務器向主用處理器發(fā)送第一通知。

步驟306:主用處理器接收到服務器發(fā)送的第一通知,根據(jù)第一通知刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù),并通知服務器建與用戶請求對應的第二SessionID。

步驟307:服務器接收到主用處理器發(fā)送的通知,為與該用戶請求對應的Session創(chuàng)建第二SessionID;服務器將創(chuàng)建的第二SessionID作為第一SessionID存儲至cookie中并將存儲了第一SessionID的cookie返回給用戶;向主用處理器發(fā)送第二通知。

步驟308:主用處理器接收到服務器發(fā)送的第二通知,根據(jù)第二通知在本地第一存儲單元中對應存儲與該用戶請求對應的第二Session數(shù)據(jù)和該第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中。

其中,本地第一存儲單元是指主用處理器自身的硬盤。

步驟309:服務器為與用戶請求對應的Session創(chuàng)建第三SessionID作為第一SessionID;向主用處理器發(fā)送第三通知。

步驟310:主用處理器接收到服務器發(fā)送的第三通知,在本地第一存儲單元中對應存儲與用戶請求對應的第三Session數(shù)據(jù)和第一SessionID,并且將對應存儲的第三Session數(shù)據(jù)和第一SessionID同步至多個輔助處理器中。

其中,輔助處理器中對應存儲有主用處理器同步過來的第三Session數(shù)據(jù)和第一SessionID。

步驟311:服務器向主用處理器發(fā)送第五通知;主用處理器接收到服務器發(fā)送的第五通知,更新自身、本地內存區(qū)域以及每個輔助處理器中存儲的第一Session數(shù)據(jù)中的最后訪問時間。轉入步驟312。

步驟312:服務器根據(jù)讀取的與用戶請求對應的第一Session數(shù)據(jù)對該用戶請求進行處理。

可選地,當主用處理器宕機時,該方法還包括:多個輔助處理器通過選舉算法在自身及其它輔助處理器中選取一個輔助處理器作為主用處理器。

需要說明的是,每一個處理器(主用處理器或輔助處理器)都相當于一個節(jié)點,也即相當于一個選民,它們都有自己的推薦人(自己或其它處理器),比如,最開始它們都推薦自己,而誰更適合成為Leader(領導者或主用處理器)有一個簡單的規(guī)則,例如配置足夠大、持有的數(shù)據(jù)夠新等等;每個選民都告訴其它選民自己目前的推薦人是誰,當選民發(fā)現(xiàn)有比自己更適合的選民時就轉而推薦這個更適合的選民;最后,大部選民意見一致時,就可以結束選舉,從而確定出主用處理器。

可選地,主用處理器和多個輔助處理器的總數(shù)量是奇數(shù)。

可選地,上述多個服務器可以是Memcached服務器,其中,Memcached是一套分布式的高速緩存系統(tǒng)。

可選地,該方法之后還包括:服務器根據(jù)讀取的與用戶請求對應的第一Session數(shù)據(jù)對該用戶請求進行處理。

需要說明的是,如何根據(jù)讀取的Session數(shù)據(jù)對用戶請求進行處理屬于本領域技術人員所熟知的慣用技術手段,此處不再贅述,并不用來限制本申請。

圖4為本申請服務器的結構示意圖,如圖4所示,包括:收發(fā)模塊、判斷模塊、查找模塊和創(chuàng)建模塊。其中,

收發(fā)模塊,用于接收到用戶請求;接收到判斷模塊發(fā)送的通知,則向主用處理器發(fā)送第一通知;接收來自主用處理器的通知,通知創(chuàng)建模塊;接收到創(chuàng)建模塊發(fā)送的通知,向主用處理器發(fā)送第二通知。

判斷模塊,用于判斷該用戶請求攜帶的cookie中是否存在第一會話標識(SessionID);當判斷出用戶請求攜帶的cookie中存在第一SessionID時,通知查找模塊;判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù);當判斷出查找到的第一Session數(shù)據(jù)是無效數(shù)據(jù)時,通知收發(fā)模塊。

查找模塊,用于在本地內存區(qū)域中查找與該第一SessionID對應的第一Session數(shù)據(jù)。

其中,查找模塊具體用于:根據(jù)第一SessionID判斷本地內存區(qū)域中是否有第一Session數(shù)據(jù);當判斷出本地內存區(qū)域中有第一Session數(shù)據(jù),從本地內存區(qū)域中讀取第一Session數(shù)據(jù);當判斷出本地內存區(qū)域中沒有第一Session數(shù)據(jù),通知收發(fā)模塊向主用處理器發(fā)送第四通知;從本地內存區(qū)域中讀取第一Session數(shù)據(jù)。

創(chuàng)建模塊,用于接收到收發(fā)模塊發(fā)送的通知,為與該用戶請求對應的Session創(chuàng)建第二SessionID;通知收發(fā)模塊向主用處理器發(fā)送第二通知。

可選地,判斷模塊,還用于當判斷出用戶請求攜帶的cookie中不存在第一SessionID時,通知創(chuàng)建模塊;相應地,

創(chuàng)建模塊,還用于接收到判斷模塊發(fā)送的通知,為與用戶請求對應的Session創(chuàng)建第三SessionID作為第一SessionID;通知收發(fā)模塊向主用處理器發(fā)送第三通知;相應地,

收發(fā)模塊,還用于向主用處理器發(fā)送第三通知。

可選地,判斷模塊,還用于當判斷出查找到的第一Session數(shù)據(jù)是有效數(shù)據(jù)時,通知收發(fā)模塊向主用處理器發(fā)送第五通知;相應地,

收發(fā)模塊,還用于接收到判斷模塊發(fā)送的通知,向主用處理器發(fā)送第五通知。

其中,判斷模塊中用于判斷查找到的第一Session數(shù)據(jù)是否是有效數(shù)據(jù)包括:

獲取當前時間;

計算獲得的當前時間和第一Session數(shù)據(jù)中的最后訪問時間之間的差值;

判斷差值是否大于預設時長閾值;

當判斷出差值大于預設時長閾值,判斷出第一Session數(shù)據(jù)是無效數(shù)據(jù);

當判斷出差值小于或等于預設時長閾值,判斷出第一Session數(shù)據(jù)是有效數(shù)據(jù)。

可選地,收發(fā)模塊,還用于將創(chuàng)建的第二SessionID作為第一SessionID存儲至cookie中并將存儲了第一SessionID的cookie返回給用戶。

圖5為本申請集群設備的結構示意圖,如圖5所示,包括:一個主用處理器和多個輔助處理器。其中,

主用處理器,用于接收到服務器發(fā)送的第一通知,根據(jù)第一通知刪除自身、本地內存區(qū)域以及每個輔助處理器中預先對應存儲的該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù),并通知服務器建與用戶請求對應的第二SessionID;接收到服務器發(fā)送的第二通知,根據(jù)第二通知在本地第一存儲單元中對應存儲與該用戶請求對應的第二Session數(shù)據(jù)和該第二SessionID,并且將對應存儲的第二Session數(shù)據(jù)和第二SessionID同步至多個輔助處理器中。

輔助處理器,用于預先對應存儲該第一SessionID和與該第一SessionID對應的第一Session數(shù)據(jù);對應存儲主用處理器同步過來的第二Session數(shù)據(jù)和第二SessionID。

可選地,主用處理器,還用于接收到服務器發(fā)送的第三通知,在本地第一存儲單元中對應存儲與用戶請求對應的第三Session數(shù)據(jù)和第一SessionID,并且將對應存儲的第三Session數(shù)據(jù)和第一SessionID同步至多個輔助處理器中;相應地,

輔助處理器,還用于對應存儲主用處理器同步過來的第三Session數(shù)據(jù)和第一SessionID。

可選地,主用處理器,還用于接收到服務器發(fā)送的第四通知,查找與第一SessionID對應的Session數(shù)據(jù);將查找到的Session數(shù)據(jù)同步至本地內存區(qū)域中。

其中,主用處理器中用于查找與第一SessionID對應存儲的Session數(shù)據(jù)包括:在多個輔助處理器中確定滿足預設條件的一個輔助處理器并通知滿足預設條件的一個輔助處理器;接收來自滿足預設條件的一個輔助處理器發(fā)送的查找到的與第一SessionID對應存儲的Session數(shù)據(jù)并將接收到的Session數(shù)據(jù)作為與第一SessionID對應的Session數(shù)據(jù);相應地,

滿足預設條件的一個輔助處理器,用于在本地第二存儲單元中查找與第一SessionID對應存儲的Session數(shù)據(jù);將查找到的與第一SessionID對應存儲的Session數(shù)據(jù)發(fā)送給主用處理器。

其中,預設條件包括:當前處理的進程數(shù)最少,或者配置最高,或者資源利用率最低等等。

可選地,主用處理器,還用于接收到服務器發(fā)送的第五通知,更新自身、本地內存區(qū)域以及每個輔助處理器中存儲的第一Session數(shù)據(jù)中的最后訪問時間。

可選地,輔助處理器,還用于當主用處理器宕機時,通過選舉算法在自身及其它輔助處理器中選取一個輔助處理器作為主用處理器。

可選地,主用處理器和多個輔助處理器的總數(shù)量是奇數(shù)。

需要說明的是,每一個處理器(主用處理器或輔助處理器)都相當于一個節(jié)點,也即相當于一個選民,它們都有自己的推薦人(自己或其它處理器),比如,最開始它們都推薦自己,而誰更適合成為Leader(領導者或主用處理器)有一個簡單的規(guī)則,例如配置足夠大、持有的數(shù)據(jù)夠新等等;每個選民都告訴其它選民自己目前的推薦人是誰,當選民發(fā)現(xiàn)有比自己更適合的選民時就轉而推薦這個更適合的選民;最后,大部選民意見一致時,就可以結束選舉,從而確定出主用處理器。

需要說明的是,在本文中,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。

上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。

本領域普通技術人員可以理解上述方法中的全部或部分步驟可通過程序來指令相關硬件(例如處理器)完成,所述程序可以存儲于計算機可讀存儲介質中,如只讀存儲器、磁盤或光盤等??蛇x地,上述實施例的全部或部分步驟也可以使用一個或多個集成電路來實現(xiàn)。相應地,上述實施例中的各模塊/單元可以采用硬件的形式實現(xiàn),例如通過集成電路來實現(xiàn)其相應功能,也可以采用軟件功能模塊的形式實現(xiàn),例如通過處理器執(zhí)行存儲于存儲器中的程序/指令來實現(xiàn)其相應功能。本發(fā)明不限制于任何特定形式的硬件和軟件的結合。

以上僅為本申請的優(yōu)選實施例,并非因此限制本申請的專利范圍,凡是利用本申請說明書及附圖內容所作的等效結構或等效流程變換,或直接或間接運用在其他相關的技術領域,均同理包括在本申請的專利保護范圍內。

當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1