我需要创建一个执行以下操作的servlet服务
当用户请求服务时,servlet会生成一个从未生成过的唯一5个字母的字符串。 (0~9和a~Z的组合)
如果用户接受,请使用唯一字符串(生成#1)作为主键保存用户的信息
我头脑中首先出现的是使用静态类变量,当请求到达servlet时增加1,但是在这里搜索并且google说这真的很糟糕,好像多个用户同时点击服务一样,它会打破...
现在我无能为力。
以增量方式生成唯一字符串的最佳和最安全的方法是什么?
答案 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));