Spring BcryptPasswordEncorder log rounds参数说明

今天在做用户上传Excel表格导入数据到Mongodb数据库的时候遇到一个超时的问题,比较有意思,在这里记录一下!需求是这样的,用户通过页面选择本地的Excel表格,通过接口将Excel表格上传到后台,由后端解析Excel表格中的数据,解析成功后保存到数据库中。对于Excel表格的处理我表示轻车熟路,本来这个功能已经做好了,而且之前还测试过上传有上万条记录的Excel表格的导入,完全没有压力。但是今天在导入新用户的时候突然提示500超时了!以下是我的解决过程:
1. 首先想到的时候Spring MVC的接口默认超时时间设置得太短了,Spring的文档说如果不设置默认超时时间,那么会根据服务器的超时时间进行设置,Tomcat一般是10s。然后我就修改了Spring的配置,增加了如下两处超时时间配置:

server:connection-timeout: 60000spring:mvc:async:request-timeout: 60000

再次上传该用户表,WTF,还是超时。

  1. 接着考虑是不是前端访问接口的时候有设置默认的超时时间,仔细F12看调用过程,否定了这个想法。
  2. 然后只能单步调试了,但是类似这样的问题设置断点进行调试往往会影响程序运行,不易复现问题,所以我选择分步打印时间戳的办法。很顺利,发现了出现问题的代码块,如下:
//用户账号信息批量初始化设置
users.stream().forEach(tempStudent -> {//设置默认用户角色tempUser.setRoles(Arrays.asList(DefaultRole));//设置用户默认登录名为编号tempUser.setUsername(tempUser.getCode());//设置用户默认密码为编号String md5Hex = DigestUtils.md5Hex(tempUser.getCode());tempUser.setPassword(md5Hex);
});

再次使用逐行注释法,最终定位到出现问题的代码是:

tempUser.setPassword(md5Hex);

而我在该代码块里面做的工作如下:

public static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder(4);
public void setPassword(String password) {this.password = PASSWORD_ENCODER.encode(password);
}

设置用户密码时使用Spring框架的BCryptPasswordEncoder对密码进行了加密。发现这个问题时感觉很困惑,按理说Spring框架这么成熟,不会有这么明细的性能瓶颈啊!再仔细去看里面的构造函数和加密方法,大概发现了问题所在,关键代码如下:

public BCryptPasswordEncoder() {this(-1);
}
public String encode(CharSequence rawPassword) {String salt;if (strength > 0) {if (random != null) {salt = BCrypt.gensalt(strength, random);}else {salt = BCrypt.gensalt(strength);}}else {salt = BCrypt.gensalt();}return BCrypt.hashpw(rawPassword.toString(), salt);
}
public static String gensalt() {return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS);
}
private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10;

原来是如果构造BCryptPasswordEncoder时不传参数就默认使用长度为10的LOG ROUND,我试着传入最小的构造参数4之后,一下子就处理完了,500错误也没有了。搜索了相关的关键词,LOG ROUND这个参数大概的意思是做加密时重复处理的轮数,而且其复杂度是指数级递增,也就是传4的时候是24次方,默认传输为10的时候是210次方!难怪其速度会差距这么大!

最后呢,显然这种在接口里面同步处理大批量数据的方法是不可取的,应该使用ActiveMQ之类的协议进行异步处理。嗯,功能完善后再迭代吧!

Spring BcryptPasswordEncorder Log Rounds参数说明相关推荐

  1. Gateway 整合 Spring Security鉴权

    目录 Spring-Security Spring-Webflux 注意 编码 项目环境版本 gradle 依赖 Spring-Security配置 1. Security核心配置 2.用户认证 3. ...

  2. 【Spring】Spring Security介绍及其入门案例

    文章目录 前言 1. SpringSecurity 框架简介 1.1 概要 1.2 历史 1.3 同款产品对比 1.3.1 Spring Security 1.3.2 Shiro 1.4 模块划分 2 ...

  3. spring 单例 获取多例的位_Spring 获取单例流程(一)

    读完这篇文章你将会收获到 在 getBean 方法中, Spring 处理别名以及 factoryBean 的 name Spring 如何从多级缓存中根据 beanName 获取 bean Spri ...

  4. [Dubbo实战]dubbo + zookeeper + spring 实战 (转)

    这里最熟悉的就是spring了,项目中应用很多.dubbo是一个实现分布式的框架,zookeeper是注册中心.给我的感觉就像多对多关系的两者表,zookeeper相当于第三张表维护关系.下面通过一个 ...

  5. spring el表达式 if else_Spring 获取单例流程(二)

    读完这篇文章你将会收获到 Spring 中 prototype 类型的 bean 如何做循环依赖检测 Spring 中 singleton 类型的 bean 如何做循环依赖检测 前言 继上一篇文章 S ...

  6. spring整合hibernate事务编程中错误分析

    2019独角兽企业重金招聘Python工程师标准>>> 在spring整合hibernate过程中,我们的配置文件: <?xml version="1.0" ...

  7. Java中的GC(垃圾回收)log

    目录 ■启动参数 ■启动Log ■GC Log ■GC Log  ---- 垃圾回收部分 Log[Full GC] ■GC Log 对性能的影响 ■JVM 内存模型 ■GC Log  ---- 垃圾回 ...

  8. Angular 6集成Spring Boot 2,Spring Security,JWT和CORS

    主要内容:Spring Boot 2的基础应用.CORS配置.Actuator监控:Spring Boot集成springfox-swagger,利用Swagger生成JSON API文档,利用Swa ...

  9. 权限管理-整合SpringSecurity

    在spring_security引入相关依赖 <dependencies> <!-- Spring Security依赖 --><dependency><gr ...

最新文章

  1. [Unity3D]Unity3D连衣裙实现游戏开发系统
  2. HDU 1011-Starship Troopers(树形背包)
  3. iOS自动化探索(四)自动化测试框架pytest - 安装和使用
  4. Jmeter当获取正则表达式匹配数字为负数时获取所有匹配的值
  5. linux之用xargs删除这个目录下面后缀为txt的文件(包括子目录)
  6. Internal Server Error - http code 500
  7. STM32基础定时器详解
  8. Flutter实战一Flutter聊天应用(二十一)
  9. 《算法导论》(CLRS)第三版 第3章总结
  10. BGP的同步规则分析
  11. Python完成电脑记事本软件的详细过程
  12. 从入门到放弃C语言-入门篇(1)
  13. 发短信属于长连接还是短连接_通过链接发送短信
  14. android 夏令时,android 时间处理(夏令时)
  15. 最简单的h264/h265/svac和g711封装成ps流符合gb28181过检码流要求
  16. K8S 1.18.0 以及KubeEdge 1.10.3 三机安装部署(含过程记录及遇到的报错和解决方法)
  17. 运气和技术的另类平衡————对大逃杀及战棋类游戏大热的原因思考(正片)
  18. 编程中遇到syntax error怎么解决?
  19. 抱怨,就是在吸引不幸
  20. python学习 day5 (3月6日)

热门文章

  1. java 锟斤 解决乱码_java eclipse 开发中文乱码锟斤拷小锟斤拷锟
  2. 暨王博士关于学术论文写作指导总结
  3. 【Cherno的OpenGL视频】Vertex buffers and drawing a triangle in OpenGL
  4. 如何清除计算机搜索框内的搜索历史记录,如何清除搜索框中的网站访问历史记录...
  5. 现代处理器的设计思想
  6. 三相交流电源中相电压电流符号表示
  7. android5.1 取消录制屏幕跳出的权限对话框
  8. android mediastore参数,从 mediastore Android获取全屏幕缩略图
  9. VB.NET 通过vbs发送微信消息
  10. 听风的插件-正在战斗中