报错如下:
原因:如图,富文本路径中存在 / 字符,导致上传出错。
解决方案:将富文本框内容在前端进行加密,后端再解密。
安装 crypto-js 插件
npm install crypto-js
创建工具类 :在 src 目录下的 utils 中创建asc.js
- import CryptoJS from 'crypto-js'
-
- // 需要和后端一致
- const KEY = CryptoJS.enc.Utf8.parse('wenhePiCloudSecre');
- const IV = CryptoJS.enc.Utf8.parse('wenhePiCloudSecre');
-
- export default {
-
- /**
- * 加密
- * @param {*} word
- * @param {*} keyStr
- * @param {*} ivStr
- */
- encrypt (word, keyStr, ivStr) {
- let key = KEY;
- let iv = IV;
- if (keyStr) {
- key = CryptoJS.enc.Utf8.parse(keyStr);
- iv = CryptoJS.enc.Utf8.parse(ivStr);
- }
- let srcs = CryptoJS.enc.Utf8.parse(word);
- var encrypted = CryptoJS.AES.encrypt(srcs, key, {
- iv: iv,
- mode: CryptoJS.mode.CBC,
- padding: CryptoJS.pad.ZeroPadding
- });
- return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
- },
-
- /**
- * 解密
- * @param {*} word
- * @param {*} keyStr
- * @param {*} ivStr
- */
- decrypt (word, keyStr, ivStr) {
- let key = KEY;
- let iv = IV;
-
- if (keyStr) {
- key = CryptoJS.enc.Utf8.parse(keyStr);
- iv = CryptoJS.enc.Utf8.parse(ivStr);
- }
-
- let base64 = CryptoJS.enc.Base64.parse(word);
- let src = CryptoJS.enc.Base64.stringify(base64);
-
- let decrypt = CryptoJS.AES.decrypt(src, key, {
- iv: iv,
- mode: CryptoJS.mode.CBC,
- padding: CryptoJS.pad.ZeroPadding
- });
-
- let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
- return decryptedStr.toString();
- }
- }
使用:引入函数,使用函数
asc.encrypt(data)
maven中引入包:
-
- <groupId>org.bouncycastlegroupId>
- <artifactId>bcprov-jdk15onartifactId>
-
1.60/version> -
创建工具类:
- package com.ruoyi.common.utils;
-
- import org.apache.commons.codec.binary.Base64;
-
- import javax.crypto.Cipher;
- import javax.crypto.spec.IvParameterSpec;
- import javax.crypto.spec.SecretKeySpec;
-
- /**
- * @author root
- */
- public class SecretUtil {
-
- /***
- * key和iv值需要和前端一致
- */
- public static final String KEY = "wenhePiCloudSecre";
-
- public static final String IV = "wenhePiCloudSecre";
-
- /**
- * 加密方法
- *
- * @param data 要加密的数据
- * @param key 加密key
- * @param iv 加密iv
- * @return 加密的结果
- */
- public static String encrypt(String data, String key, String iv) {
- try {
- //"算法/模式/补码方式"NoPadding PkcsPadding
- Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- int blockSize = cipher.getBlockSize();
-
- byte[] dataBytes = data.getBytes();
- int plaintextLength = dataBytes.length;
- if (plaintextLength % blockSize != 0) {
- plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
- }
-
- byte[] plaintext = new byte[plaintextLength];
- System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
-
- SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
- IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
-
- cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
- byte[] encrypted = cipher.doFinal(plaintext);
-
- return new Base64().encodeToString(encrypted);
-
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
-
- /**
- * 解密方法
- *
- * @param data 要解密的数据
- * @param key 解密key
- * @param iv 解密iv
- * @return 解密的结果
- */
- public static String desEncrypt(String data, String key, String iv) {
- try {
- byte[] encrypted1 = new Base64().decode(data);
-
- Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
- IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
- cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
- byte[] original = cipher.doFinal(encrypted1);
- return new String(original).trim();
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- }
使用:
object.setDocContent(SecretUtil.desEncrypt(object.getDocContent(),SecretUtil.KEY,SecretUtil.IV));
搞定~