Servlet返回/生成唯一字符串

时间:2016-07-18 18:52:07

标签: java servlets java-ee unique

我需要创建一个执行以下操作的servlet服务

  1. 当用户请求服务时,servlet会生成一个从未生成过的唯一5个字母的字符串。 (0~9和a~Z的组合)

  2. 如果用户接受,请使用唯一字符串(生成#1)作为主键保存用户的信息

  3. 我头脑中首先出现的是使用静态类变量,当请求到达servlet时增加1,但是在这里搜索并且google说这真的很糟糕,好像多个用户同时点击服务一样,它会打破...

    现在我无能为力。

    以增量方式生成唯一字符串的最佳和最安全的方法是什么?

2 个答案:

答案 0 :(得分:1)

在表中添加字段序列no,当有新请求到达时,从数据库中获取最高序列号,然后添加一个,即加1并保存

答案 1 :(得分:0)

根据this site,您的最高数字(ZZZZZ)是426088025.在数据库世界中,您想要使用序列,但是,由于您的5个字符限制,您需要确保它不会超过这个数字(希望你的存储记录少于426M)。

要创建序列,您可以执行以下操作:

create sequence your_sequence maxvalue 426088025 no cycle

这就是PostgreSQL语法 - 您的数据库可能会有所不同。

然后,在您的代码中,您可以执行

select nextval('your_sequence')

获取您的值,然后Base64编码此值。在PostgreSQL中,“无循环”意味着如果达到最大值,它将引发错误。

在Java 8中,包括Base64:

import java.util.Base64;

...

String userNumber = Base64.getEncoder().encodeToString(Integer.toString(integerFromSequenceSelect));

否则,如果您遇到旧版Java,请使用Apache Commons Codec并运行:

import org.apache.commons.codec.binary.Base64;

...

String userNumber = Base64.encodeBase64String(Integer.toString(integerFromSequenceSelect));