bug原因
今天测试人员在测试的时候发现获取图形验证码接口在访问时候加载速度非常慢,要一两分钟才能加载出来,看日志的时候发现报了下边的一段警告日志:
2019-01-24 09:36:33.654 [http-nio-8080-exec-5] WARN org.apache.catalina.util.SessionIdGeneratorBase:180 - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [106,771] milliseconds.
2019-01-24 09:36:33.656 [http-nio-8080-exec-3] WARN org.apache.catalina.util.SessionIdGeneratorBase:180 - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [26,105] milliseconds.
通过搜索发现原因如下
linux默认的SecureRandom实现方式是非常慢的NativePRNG,而在Windows上的默认实现是SHA1PRNG,你也可以在Linux上指定使用该方式。
……NativePRNG会不断从操作系统获取熵(从/dev/urandom读取),其它PRNG则不会获取这些额外的熵。
AESCounterRNG差不多比SHA1PRNG快的十倍,而如果我没记错,SHA1PRNG比NativePRNG快两到三倍
SecureRandom是java用来获取高级随机数的实现,而访问获取图形验证码接口速度很慢的原因就是因为在linux上项目生成随机数的时候使用的是最慢的NativePRNG导致的
解决办法
-
在 JVM 环境中解决(我在项目中使用的是这种方式)
打开$JAVA_PATH/jre/lib/security/java.security
这个文件找到修改该securerandom.source
的值修改前 securerandom.source=file:/dev/random 修改后 securerandom.source=file:/dev/./urandom
如果为SpringBoot项目可以在执行jar启动命令中添加配置
修改前 java -jar pc.jar 修改后 java -jar -Djava.security.egd=file:/dev/./urandom pc.jar
-
在Tomcat环境中解决
可以通过配置 JRE 使用非阻塞的 Entropy Source: 在 catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。