编程示例: 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.mzph.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;是一种数据…