編程示例: Session Id的生成

實現思路

Session的實現方式如下:在用戶第一次登錄的時候,系統為它分配一個唯一Id(被稱為Session Id)作為標識,并且
記錄下這個用戶的用戶名、要登錄的賬套名、用戶擁有的權限等,以Id為鍵,用戶名、賬套名等信息為值保存到一
張Session哈希表中。以后客戶端登錄的時候只要提供此Id即可,應用服務器可以通過此Id到Session哈希表中查詢
到所需要的一切信息。因為Session哈希表是保存在存儲器中的(通常是內存),存儲過多的Session信息將會占用內存
空間,所以客戶端退出的時候要通知應用服務器注銷此Id。

具體到細節還有一些問題需要處理:

l?? 如何生成唯一的Id。

l?? 如何保存用戶名、賬套名等信息,如何能在Session中放入自定義的信息。

l?? 如何維護管理Session。

l?? 如何清除Session。當系統非正常退出的時候,比如客戶端機器故障,客戶端是無法通知應用服務器注銷Id的,
這會造成應用服務器中存在垃圾Session。

l?? 如何防止此Id被惡意程序截獲,從而冒充合法客戶端登錄系統。

?Session Id的生成

客戶端Session Id的生成與數據庫中的主鍵生成面對的問題是類似的。以可移植、高效率、可靠的方式來生成主鍵是一個非常重要的問題。可移植指的是主鍵生成策略不能依賴于服務器、操作系統、數據庫等;高效率是生成主鍵的過程必須足夠快,不能讓生成主鍵的算法成為系統的瓶頸;可靠指的是生成的主鍵必須保證唯一性。主鍵生成方式可以分為數據庫相關方式和數據庫無關方式兩種。

數據庫相關方式是通過數據庫的幫助來生成主鍵。對于支持自增字段的數據庫,可以借助其序列號發生器來產生唯一的主鍵;對于不支持自增字段的數據庫,可以在系統中放置一張表,采用此表記錄本次生成的主鍵,這樣就保證了生成的主鍵與以前的不沖突。數據庫相關方式的優點是實現簡單,而且可以完全保證生成主鍵的唯一性;不過由于需要數據庫來維護主鍵的狀態和同步對主鍵生成器的訪問,所以對數據庫有依賴性,而且由于需要訪問數據庫,其生成速度較慢。

數據無關方式是無須依靠數據庫而生成主鍵的方式。最典型的算法就是UUID算法。UUID是一個字符串,它被編碼為包含了使生成的UUID在整個空間和時間上都完全唯一的所必需的系統信息集,不管這個UUID是何時何地被生成的。原始的UUID規范是由Paul Leach和Rich Salz在網絡工作組因特網草案中定義的。

UUID字符串一般由下面信息構成:

l?? 系統時鐘的毫秒值。這是通過System.currentTimeMillis()方法得到的。這保證了在時間維度上產生主鍵的唯一性。

l?? 網絡IP或者網卡標識。這保證了在集群環境中產生主鍵的唯一性。

l?? 精確到在一個JVM內部的對象的唯一。通常是System.identityHashCode(this)所調用產生的編碼,這個方法調用保證對JVM中不同對象返回不同的整數。即使在同一臺機器上存在多個JVM,兩個UUID生成器返回相同的UUID的情況也極不可能發生。

l?? 在一個對象內的毫秒級的唯一。這是由與每一個方法調用所對應的隨機整數,這個隨機整數是通過使用java.security.SecureRandom類生成的。這可以保證在同一毫秒內對同一個方法的多個調用都是唯一的。

上述這些部分組合在一起,就可以保證生成的UUID在所有機器中(IP不重復或者網卡地址不重復),以及在同一臺機器上的JVM內部的所有UUID生成器的實例中都保持唯一,并且能精確到毫秒級甚至是一個毫秒內的單個方法調用的級別。

流行的UUID算法有很多,這些算法有的不能完全保證生成的UUID的唯一性,必須根據情況選用。下面推薦兩種UUID實現算法。

【例】UUID.Hex算法。

這個算法是Hibernate中主鍵策略為“uuid.hex”時所使用的算法,代碼位于包org.hibernate.id下的UUIDHexGenerator.java文件中。

調用方法:

IdentifierGenerator gen = new UUIDHexGenerator();

for (int i = 0; i < 10; i++)

{

??? String id = (String) gen.generate(null, null);

??? System.out.println(id);

}

運行結果(UUID的生成是不重復的,每次的運行結果都會不同):

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165294.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云原生Kubernetes系列 | Kubernetes靜態Pod的使用

云原生Kubernetes系列 | Kubernetes靜態Pod的使用 靜態pod不建議在master上操作,因為master上跑的是集群核心靜態pod,如果配置失敗,會導致集群故障。建議在knode1或knode2上去做。 kubernetes master節點上的核心組件pod其實都是靜態pod: [root@k8s-master ~]# ls /etc/ku…

java中鎖的使用-實戰

技術主題 技術原理 在實際的業務中,為了保證線程安全,會進行對一些邏輯進行加鎖,保證當前只有一個線程在操作。在代碼中,我們經常使用兩種方式進行加鎖,來保證線程安全。一種是synchronized關鍵字,另一種是ReentrantLock加鎖。寫這一份的博客,就是為了記錄下鎖的基本使…

五分鐘,Docker安裝flink,并使用flinksql消費kafka數據

1、拉取flink鏡像&#xff0c;創建網絡 docker pull flink docker network create flink-network2、創建 jobmanager # 創建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES"jobmanager.rpc.ad…

Redis 命令行 redis-cli 介紹

文章目錄 前言1. 連接 Redis 服務2. 從其他程序獲取輸入3. 連續執行相同的命令4. CSV 輸出5. 輸出幫助信息6. 清空屏幕7. 連續監控統計信息8. 輸出大 key 報告9. 監控 Redis 執行的命令 前言 redis-cli 是 Redis 自帶的命令行工具&#xff0c;是運維和開發人員常用的工具&…

【C++干貨鋪】適配器 | stack | queue

個人主頁點擊直達&#xff1a;小白不是程序媛 C系列學習專欄&#xff1a;C干貨鋪 代碼倉庫&#xff1a;Gitee 目錄 stack的介紹和使用 stack的介紹 stack的使用 queue的介紹和使用 queue的介紹 queue的使用 容器適配器 什么是適配器 STL中stack和queue的底層結構 d…

Doris擴容和縮容(六)

Doris 可以很方便的擴容和縮容 FE、BE、Broker 實例。 FE 擴容和縮容 可以通過將 FE 擴容至 3 個以上節點來實現 FE 的高可用。 1&#xff09;使用 MySQL 登錄客戶端后&#xff0c;可以使用 sql 命令查看 FE 狀態&#xff0c;目前就一臺 FE mysql -h hadoop1 -P 9030 -uroo…

Python——基于YOLOV8的車牌識別(源碼+教程)

目錄 一、前言 二 、完成效果 三、 項目包 四、運行項目 &#xff08;教程&#xff09; 一、前言 YOLOv8LPRNet車牌定位與識別https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一個車牌識別的小需求&#xff0c;今天完成了&#xff0c;在此記錄和分享 首先&#x…

辦公技巧:Word中插入圖片、形狀、文本框排版技巧

目錄 一、插入圖片排版技巧 二、添加形狀排版技巧 三、插入“文本框”排版技巧 我們平常在制作word時候經常會遇到插入選項卡下的圖片、形狀和文本框這三種情況下&#xff0c;那么如何使得Word文檔當中添加這三個元素的同時&#xff0c;又能保證樣式美觀呢&#xff0c;今天小…

ComfyUI搭建使用教程

ComfyUI 是一個基于節點流程式的stable diffusion AI 繪圖工具WebUI&#xff0c; 你可以把它想象成集成了stable diffusion功能的substance designer&#xff0c; 通過將stable diffusion的流程拆分成節點&#xff0c;實現了更加精準的工作流定制和完善的可復現性。但節點式的工…

【分布式】分布式事務及其解決方案

目錄 一、分布式事務二、分布式事務的解決方案1. 全局事務&#xff08;1&#xff09;DTP模型&#xff08;2&#xff09; 兩階段提交協議&#xff08;2PC&#xff09;原理二階段提交的缺點 &#xff08;3&#xff09;三階段提交協議&#xff08;3PC&#xff09;原理 2. 基于可靠…

【算法】搭配購買(01背包,加權并查集)

題目 Joe覺得云朵很美&#xff0c;決定去山上的商店買一些云朵。 商店里有 n 朵云&#xff0c;云朵被編號為 1,2,…,n&#xff0c;并且每朵云都有一個價值。 但是商店老板跟他說&#xff0c;一些云朵要搭配來買才好&#xff0c;所以買一朵云則與這朵云有搭配的云都要買。 …

DDoS攻擊和CC攻擊有什么不同之處?

DDoS是針對服務器IP發起&#xff0c;CC攻擊針對的是業務端口。DDoS攻擊打的是網站的服務器&#xff0c;而CC攻擊是針對網站的頁面攻擊&#xff0c;用術語來說就是&#xff0c;一個是WEB網絡層拒絕服務攻擊&#xff08;DDoS&#xff09;&#xff0c;一個是WEB應用層拒絕服務攻擊…

Linux添加環境變量$PATH

變量$PATH 查看環境變量 [rootlocalhost lnserver]# echo $PATH /usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/root/bin由于沒有docker路徑的環境變量&#xff0c;docker命令使用無效 要將腳本添加到 PATH 中&#xff0c;以便無論在哪個目錄中都可以調用它或執行它&…

【鏈路追蹤】xxl-job定時任務日志增加traceId

問題背景 項目中通過sleuth實現了統一的traceId注入&#xff0c;在生產環境進行日志追溯時比較方便。但是在使用xxl-job進行定時任務管理時&#xff0c;卻發現xxl-job線程打印出來的日志沒有traceId&#xff0c;查詢日志時十分不方便&#xff0c;于是通過使用Spring aop的方式…

點云從入門到精通技術詳解100篇-基于深度學習的稀疏點云障礙物檢測

目錄 前言 國內外研究現狀 激光雷達點云配準 激光雷達目標檢測

c#代碼Linq中使用OrderBy進行自定義排序

c#代碼Linq中使用OrderBy進行自定義排序 /// <summary>/// 自定義字符串比較器 用于自定義排序/// </summary>public class StringComparer : IComparer<string>{/// <summary>/// 偏好的排序列表/// </summary>public List<string> _pre…

RK3568基于openharmony3.2版本之MIPI屏幕調試

mipi調試過程 1、前言2、開發環境3、調試過程3.1、下載openharmony3.2源碼3.2、設備樹上增加mipi-dsi屏幕的節點3.3、 分析kernel顯示不出來畫面3.4、 mipi屏幕顯示效果圖1、前言 由于工作需要,RK3568需要支持openharmony3.2系統版本,需要重新移植下載源碼并且適配自家公司的…

【JavaWeb】HTMLCSSJavaScript

HTML&CSS&JavaScript 文章目錄 HTML&CSS&JavaScript一、開發工具及在線幫助文檔二、 HTML2.1 HTML&CSS&JavaScript的作用2.2 HTML基礎結構2.3 HTML概念詞匯解釋2.4 HTML的語法規則2.5 常用標簽 三、CSS3.1 引入方式3.2 CSS選擇器3.3 CSS浮動3.4 CSS定位…

MindSpore基礎教程:LeNet-5 神經網絡在MindSpore中的實現與訓練

MindSpore基礎教程&#xff1a;LeNet-5 神經網絡在MindSpore中的實現與訓練 官方文檔教程使用已經棄用的MindVision模塊&#xff0c;本文是對官方文檔的更新 深度學習在圖像識別領域取得了顯著的成功&#xff0c;LeNet-5 作為卷積神經網絡的經典之作&#xff0c;在諸多研究和應…

Linux | 從虛擬地址到物理地址

前言 本章主要講解虛擬地址是怎么轉化成物理地址的&#xff0c;以及頁表相關知識&#xff1b;本文環境默認為32位機器下&#xff1b;如果你連什么是虛擬地址都不知道可以先看看下面這篇文章&#xff1b; Linux | 進程地址空間-CSDN博客 一、概念補充 頁表&#xff1a;是一種數據…