org.springframework.util.Base64Utils线程安全问题

探讨Spring中Base64Utils在多线程环境下的异常问题,包括ArrayIndexOutOfBoundsException和NullPointerException,提出使用synchronized解决并发问题及直接使用Apache Commons Codec Base64替代的方法。
摘要由CSDN通过智能技术生成
  Spring 提供的 org.springframework.util.Base64Utils 类,先会检测JDK里是否自带java.util.Base64,如果不带,则 使用的是 apache 提供的org.apache.commons.codec.binary.Base64:
 

 
经过一段时间的生产试运行来看, 在多线程环境中Base64Utils会出各种异常,比如这样的异常:
java.lang.ArrayIndexOutOfBoundsException: null 
at org.apache.commons.codec.binary.BaseNCodec.readResults(BaseNCodec.java:209) 
at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:324) 
at org.springframework.util.Base64Utils$CommonsCodecBase64Delegate.decode(Base64Utils.java:164)
at org.springframework.util.Base64Utils.decodeFromString(Base64Utils.java:124)
...
java.lang.NullPointerException: null 
at java.lang.System.arraycopy(Native Method) 
at org.apache.commons.codec.binary.BaseNCodec.readResults(BaseNCodec.java:209) 
at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:324) 
at org.springframework.util.Base64Utils$CommonsCodecBase64Delegate.decode(Base64Utils.java:164) 
at org.springframework.util.Base64Utils.decodeFromString(Base64Utils.java:124)
...
又或者没抛异常,但Base64Utils.decodeFromString解出的数据已经不准确了,比如此时用它解码出的数据或秘钥来进行解密的话,会出类似如下异常:
  javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
 at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
 at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
 at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DESedeCipher.java:294)
 at javax.crypto.Cipher.doFinal(Cipher.java:2087)
...
但具体由哪个类引起的并发,原因有待分析,可能与JDK版本、org.apache.commons.codec.binary.Base64、java.util.Base64都有关系 ,不管问题出在哪,在使用Base64Utils的地方,加上同步应该即可解决:
 synchronized (Base64Utils.class) {
            key = Base64Utils.decodeFromString(keyBase64);
}
 synchronized (Base64Utils.class) {
            rtnValue = Base64Utils.encodeToString(data);
}
或者不使用 org.springframework.util.Base64Utils,而是直接使用 apache 提供的org.apache.commons.codec.binary.Base64(相应方法:Base64.decodeBase64(keyBase64),Base64.encodeBase64String(data) ,并发环境下目前发现没有问题,代码参见附件!!
 
由于 synchronized  同步会引起性能问题,如果直接使用org.apache.commons.codec.binary.Base64
没有问题的话,还是采用这种方式吧
 

 

 
 
 
 

附件列表

 

转载于:https://www.cnblogs.com/jiangzhengjun/p/10840742.html

引用\[1\]和\[2\]中的内容是关于请求处理失败的异常信息,具体原因是在处理请求时出现了一些错误,比如找不到属性的setter方法、参数设置错误等。而引用\[3\]中的内容是关于解决这个问题的方法,即在pom文件中添加一些配置信息。根据这些信息,可以得出结论是在处理请求时发生了异常,可能是由于代码中的错误或配置问题导致的。为了解决这个问题,可以尝试按照引用\[3\]中的方法进行配置。 #### 引用[.reference_title] - *1* [nested exception is org.apache.ibatis.reflection.ReflectionException](https://blog.csdn.net/qq_39736176/article/details/82904792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [org.springframework.web.util.NestedServletException: Request processing failed; nested exception...](https://blog.csdn.net/Daneliya/article/details/88062861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [org.springframework.web.util.NestedServletException](https://blog.csdn.net/selt791/article/details/83037555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值