- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我有一个要求,我需要生成 SessionID 之类的东西,但也是同时生成的。我正在考虑从 tomcat 7 源“SessionIdGenerator”获取代码。但不确定是否会在不做任何修改的情况下并发生成uniqueID。
类本身在这里:
公共(public)类 SessionIdGenerator {
private Logger logger = LoggerFactory.getLogger();
/**
* Queue of random number generator objects to be used when creating session
* identifiers. If the queue is empty when a random number generator is
* required, a new random number generator object is created. This is
* designed this way since random number generators use a sync to make them
* thread-safe and the sync makes using a a single object slow(er).
*/
private Queue<SecureRandom> randoms = new ConcurrentLinkedQueue<SecureRandom>();
/**
* The Java class name of the secure random number generator class to be
* used when generating session identifiers. The random number generator
* class must be self-seeding and have a zero-argument constructor. If not
* specified, an instance of {@link SecureRandom} will be generated.
*/
private String secureRandomClass = null;
/**
* The name of the algorithm to use to create instances of
* {@link SecureRandom} which are used to generate session IDs. If no
* algorithm is specified, SHA1PRNG is used. To use the platform default
* (which may be SHA1PRNG), specify the empty string. If an invalid
* algorithm and/or provider is specified the {@link SecureRandom} instances
* will be created using the defaults. If that fails, the {@link
* SecureRandom} instances will be created using platform defaults.
*/
private String secureRandomAlgorithm = "SHA1PRNG";
/**
* The name of the provider to use to create instances of
* {@link SecureRandom} which are used to generate session IDs. If
* no algorithm is specified the of SHA1PRNG default is used. If an invalid
* algorithm and/or provider is specified the {@link SecureRandom} instances
* will be created using the defaults. If that fails, the {@link
* SecureRandom} instances will be created using platform defaults.
*/
private String secureRandomProvider = null;
/** Node identifier when in a cluster. Defaults to the empty string. */
private String jvmRoute = "";
/** Number of bytes in a session ID. Defaults to 16. */
private int sessionIdLength = 16;
/**
* Specify a non-default @{link {@link SecureRandom} implementation to use.
*
* @param secureRandomClass The fully-qualified class name
*/
public void setSecureRandomClass(String secureRandomClass) {
this.secureRandomClass = secureRandomClass;
}
/**
* Specify a non-default algorithm to use to generate random numbers.
*
* @param secureRandomAlgorithm The name of the algorithm
*/
public void setSecureRandomAlgorithm(String secureRandomAlgorithm) {
this.secureRandomAlgorithm = secureRandomAlgorithm;
}
/**
* Specify a non-default provider to use to generate random numbers.
*
* @param secureRandomProvider The name of the provider
*/
public void setSecureRandomProvider(String secureRandomProvider) {
this.secureRandomProvider = secureRandomProvider;
}
/**
* Specify the node identifier associated with this node which will be
* included in the generated session ID.
*
* @param jvmRoute The node identifier
*/
public void setJvmRoute(String jvmRoute) {
this.jvmRoute = jvmRoute;
}
/**
* Specify the number of bytes for a session ID
*
* @param sessionIdLength Number of bytes
*/
public void setSessionIdLength(int sessionIdLength) {
this.sessionIdLength = sessionIdLength;
}
/**
* Generate and return a new session identifier.
*/
public String generateSessionId() {
byte random[] = new byte[16];
// Render the result as a String of hexadecimal digits
StringBuilder buffer = new StringBuilder();
int resultLenBytes = 0;
while (resultLenBytes < sessionIdLength) {
getRandomBytes(random);
for (int j = 0;
j < random.length && resultLenBytes < sessionIdLength;
j++) {
byte b1 = (byte) ((random[j] & 0xf0) >> 4);
byte b2 = (byte) (random[j] & 0x0f);
if (b1 < 10)
buffer.append((char) ('0' + b1));
else
buffer.append((char) ('A' + (b1 - 10)));
if (b2 < 10)
buffer.append((char) ('0' + b2));
else
buffer.append((char) ('A' + (b2 - 10)));
resultLenBytes++;
}
}
if (jvmRoute != null && jvmRoute.length() > 0) {
buffer.append('.').append(jvmRoute);
}
return buffer.toString();
}
private void getRandomBytes(byte bytes[]) {
SecureRandom random = randoms.poll();
if (random == null) {
random = createSecureRandom();
}
random.nextBytes(bytes);
randoms.add(random);
}
/**
* Create a new random number generator instance we should use for
* generating session identifiers.
*/
private SecureRandom createSecureRandom() {
SecureRandom result = null;
long t1 = System.currentTimeMillis();
if (secureRandomClass != null) {
try {
// Construct and seed a new random number generator
Class<?> clazz = Class.forName(secureRandomClass);
result = (SecureRandom) clazz.newInstance();
} catch (Exception e) {
logger.debug("exception:"+e);
}
}
if (result == null) {
// No secureRandomClass or creation failed. Use SecureRandom.
try {
if (secureRandomProvider != null &&
secureRandomProvider.length() > 0) {
result = SecureRandom.getInstance(secureRandomAlgorithm,
secureRandomProvider);
} else if (secureRandomAlgorithm != null &&
secureRandomAlgorithm.length() > 0) {
result = SecureRandom.getInstance(secureRandomAlgorithm);
}
} catch (NoSuchAlgorithmException e) {
logger.debug("exception:"+e);
} catch (NoSuchProviderException e) {
logger.debug("exception:"+e);
}
}
if (result == null) {
// Invalid provider / algorithm
try {
result = SecureRandom.getInstance("SHA1PRNG");
} catch (NoSuchAlgorithmException e) {
logger.debug("exception:"+e);
}
}
if (result == null) {
// Nothing works - use platform default
result = new SecureRandom();
}
// Force seeding to take place
result.nextInt();
long t2=System.currentTimeMillis();
if( (t2-t1) > 100 )
logger.debug("sessionIdGenerator algorithm:"+result.getAlgorithm()+"time taken:" +Long.valueOf(t2-t1));
return result;
}
}
最佳答案
我会使用java.util.UUID.randomUUID()
来代替。非常简单并保证唯一性。
关于java - 如何同时生成UniqueID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12284430/
我在表“main”中有一个列“ProviderName”,填充如下: Alaska Medicaid Arizona Medicaid Arkansas Medicaid California Med
我正在生成一个 OrderId,它应该由 yyMMddhhmmssMs 组成,这个 orderId 表示 Orders 表的主键字段。 我生成订单 ID 的方式如下: import java.text
MailKit.Net.Imap 有 MoveTo(...)。但是如果我们移动消息,消息将获得新的 UniqueID(因为它在文件夹中是唯一的)。如何获取消息的新 UniqueID? 最佳答案 采用
每 Item (例如 Task )在 Exchange Web 服务 (EWS) 托管 API 中有一个 Id类型的属性 ItemId ,然后有一个 String属性命名 UniqueId (继承自
我正在尝试通过列表项的 REST API 端点通过其唯一 ID 获取列表项。 网址 https://{site-collection}/{personal-site}/_api/Web/Lists(g
我有一个定义如下的表: mysql> select * from rules; +----+----------+-------+--------------+---------------+----
如果我的页面中有现有的 HTML: foo 然后我运行 JS 代码: $('bar').appendTo('body').uniqueId(); 然后,新的 p 元素获得 ID ui-id-1。我
我正在使用 C# 在 .NET Framework 中开发一个 Windows 应用程序。我想知道制造的每台计算机是否有任何唯一 ID,让它由任何制造商制造,但它必须是唯一的。 谢谢,比布 最佳答案
在谷歌搜索没有结果后,我会问我的问题: Mailkit.UniqueId 是什么? 在结构的元数据中只是读取 Represents a unique identifier for messages i
应该是一个简单的答案,可能是我的语法不正确,因为我是 ReactJS 的新手。我想指定一个唯一的 ID 作为键。 这会引发错误: rows:{ uniqueId() : { name:"Kitch
我正在映射多个单选按钮(组)选项,当用户单击单选按钮时,我想将选定的值和 uniqueIds 添加到数组中。 使用我当前的代码,我可以获得我当前单击但无法添加到数组的值。 {result !== nu
在应用程序中,当创建特殊类型的对象时,我需要为它们中的每一个生成一个唯一标识。这些对象是通过工厂创建的,并且很有可能在“批量”操作中创建。我意识到框架中的“随机”毕竟不是那么“随机”,所以我尝试按如下
一个大问题是我不是一个程序员…所以我需要用我自己能力范围内的方法来解决这个问题…我会很高兴得到帮助! 我有一个问题,谷歌索引中有很多重复的网址,有强烈的迹象表明,这是造成搜索引擎优化问题。 我没有网站
有人知道控件的 UniqueId 是什么时候分配的吗? 现在我的 Page_Init 中有一些基于 UniqueId 的代码。但是,根据某些业务逻辑,我可能需要在此之前重新安排页面的控件层次结构。 所
我需要一个即使在库中打开版本控制时也是唯一的值。我应该调用其他属性吗? 最佳答案 spListItem 类有一个版本对象,其中包含该对象的所有版本。每个SPListItemVersion具有 Vers
控件的 UniqueID 用 '$' 分隔,分隔符是否可以更改,如果可以,是否有包含分隔符的属性? 最佳答案 鉴于有 protected属性(property) IdSeparator 和 Clien
似乎 jquery ui 已加载,因为当我运行时 $(function(){ // did the UI load? console.log($.ui.version)
尝试使用lodash (版本4.17.11) _.uniqueId() 始终返回 1,而不是随机的 3 位数。 此外,_.uniqueId('prefix') 始终返回 prefix1。 有问题吗?
我正在学习 RavenDB 并熟悉其工作原理。我不明白的一件事是如何将乌鸦创建的 ID 保存到属性中。 public class User { public string FirstName
我正在尝试为 Android 手机和平板电脑生成一个唯一 ID。我发现了一个有趣的功能,但对于我全新的 galaxy tab 2,它不起作用。这是我的功能: public String generat
我是一名优秀的程序员,十分优秀!