错误日志:使用AES解密出现undefined,但不报错。

本文记录了一次使用AES加密解密时遇到的问题:对前端传来的空字符串进行解密时得到undefined。通过排查发现前端获取值时未正确使用ID选择器,导致实际未取到值。进一步验证AES会加密空字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在写使用AES加密解密时出现了一个很郁闷的问题,找了很久才找到原因所在。特意在这里记录一下。
下面是错误的具体示例:
在使用AES在后台对前端传过来的参数进行解密时,使用AES工具类的AESUtils.decr();方法并将解密过后的内容进行打印,结果出现undefined。
在这里插入图片描述在这里插入图片描述
而且我在前端对传过来的password加密之后alert()了一下,发现的确有加密之后的内容,也就是说,看起来似乎值已经传过来了
在这里插入图片描述
检查了后端代码之后,终于找到报出undefined的具体代码
在这里插入图片描述这时我以为是lang3包导入出错,因此重新导入了一次,然而还是无法解决问题,然而我将mes的长度打印出来,显示的结果mes是有长度的,也即是说mes其实是有值存在。
我不得不开始怀疑是不是new String()出现了问题,翻了一遍API没有找到理想的答案。

最后,在另一次返回前端修改代码的时候,我终于发现问题所在
在这里插入图片描述
原来是我利用id选择器进行取值的时候没有加“#”。也就是说其实password并没有取到值。
但为什么还是能够加密呢?
因此我猜测AES不仅会对有值的数据进行加密,同时还会对空串进行加密,然后我又试了一下
在这里插入图片描述
在这里插入图片描述
果然加密了!这样也就找到了问题所在。

总结:AES不仅会对具体的值加密,而且也会对空串进行加密。因此在解密时它解密出来实际上也是一个空串,但为什么会报出undefined,这就涉及到AES更深层次的底层原理代码之中了。

<think>好的,我现在需要帮助用户解决在安卓前端使用`uni.setStorageSync`的问题。首先,我得回顾之前的对话和提供的引用内容,确保回答符合用户的需求和之前的指导。 用户之前已经得到了关于`uni.setStorageSync`的详细解析,包括基本用法、高频问题和最佳实践。现在用户特别询问在安卓前端的使用方法和注意事项。需要明确的是,UniApp是跨平台的,所以大部分用法在安卓端和其他平台是一致的,但可能存在一些平台特定的注意事项。 首先,我需要确认用户提到的“安卓前端”具体指的是什么。通常,UniApp开发的安卓应用是使用HBuilder工具打包成APK,运行在安卓设备上的WebView环境中。因此,`uni.setStorageSync`在安卓端的实现依赖于WebView的本地存储机制,类似于H5的localStorage。不过,安卓平台可能会有一些限制或差异,比如存储容量、数据持久性等。 根据引用内容,特别是引用[2]提到`uni.setStorageSync`用于同步存储数据,适用于保存用户配置、登录状态等。引用[1]中的示例展示了存储字符串、对象和数组,但需要注意存储对象时需要显式序列化。引用[4]提供了误处理的示例,使用`try...catch`来捕获可能的异常,这对安卓端同样重要,因为存储可能失败,比如超出容量限制。 接下来,用户可能需要了解安卓端特有的问题。例如,在安卓应用中,如果用户清除应用缓存或数据,`uni.setStorageSync`存储的内容也会被清除,这一点需要提醒用户。此外,安卓平台对存储容量可能有不同的限制,需要参考官方文档或实际测试结果。 另外,数据安全在移动端尤为重要,特别是敏感信息如用户令牌。引用[2]提到使用加密存储,如CryptoJS,这在安卓端同样适用,需要建议用户对敏感数据进行加密处理。 还需要考虑跨端兼容性问题。虽然UniApp旨在跨平台,但在安卓端可能遇到与其他平台不同的行为,例如在H5端可能遇到的隐私模式问题,在安卓端可能不存在,但需要确认。此外,安卓应用的存储路径和权限是否会影响`uni.setStorageSync`的使用,比如是否需要额外的权限申请。 用户可能还关心性能问题,同步存储是否会阻塞UI线程。在安卓的WebView中,同步操作可能会导致界面卡顿,因此对于大数据量的存储,建议使用异步API`uni.setStorage`,但用户明确询问的是同步方法,所以需要说明在安卓端使用同步方法时的注意事项,比如避免存储过大的数据。 最后,根据之前的回答结构,需要保持一致性,分点列出使用方法、注意事项、常见问题及解决方案,并引用相关文献。同时,生成相关问题,帮助用户进一步探索。</think>### 安卓端 `uni.setStorageSync` 使用指南 `uni.setStorageSync` 在安卓端的用法与其他平台(如 H5、小程序)基本一致,但需注意**安卓平台特性与兼容性问题**。以下是具体实现方法与注意事项,结合 UniApp 官方文档[^3]和安卓开发经验整理。 --- #### 一、安卓端核心用法 ##### 1. 基础存储与读取 ```javascript // 存储字符串 uni.setStorageSync('username', '安卓用户A'); // 存储对象(需手动序列化) const userData = { uid: 1001, role: 'admin' }; uni.setStorageSync('userData', JSON.stringify(userData)); // 读取数据 const rawData = uni.getStorageSync('userData'); const parsedData = JSON.parse(rawData); // 反序列化 console.log(parsedData.uid); // 输出: 1001 ``` ##### 2. 删除与清空 ```javascript // 删除指定键值 uni.removeStorageSync('username'); // 清空所有缓存(慎用!) uni.clearStorageSync(); ``` --- #### 二、安卓端特有注意事项 1. **存储路径与权限** - **路径**:安卓端数据存储在应用沙盒的 `localStorage` 中,路径为 `/data/data/[应用包名]/app_webview/Local Storage` - **权限**:无需额外申请存储权限,但若应用被用户手动清除缓存,所有数据将丢失[^4]。 2. **数据持久性** - 安卓端数据**不会因应用重启丢失**,但以下情况会清除缓存: - 用户主动清除应用缓存 - 应用卸载重装 - 调用 `uni.clearStorageSync()` 3. **存储容量限制** | 平台 | 容量上限 | 建议单个 key 大小 | |---------|---------------|------------------| | 安卓端 | 默认 **5MB** | ≤ 1MB | **超出限制的报处理**: ```javascript try { uni.setStorageSync('largeKey', hugeData); } catch (e) { console.error('安卓存储失败:', e); uni.showModal({ title: '提示', content: '存储空间不足' }); } ``` 4. **数据类型兼容性** - **支持类型**:字符串、数字、布尔值、序列化后的 JSON 对象 - **禁止类型**:`Function`、`Date`、`Undefined`(存储时会自动过滤或转为 `null`) --- #### 三、高频问题与解决方案 1. **数据加密需求** **场景**:存储敏感信息(如 token、用户隐私数据) **方案**:使用 AES 加密库(如 crypto-js) ```javascript import CryptoJS from 'crypto-js'; // 加密存储 const encrypted = CryptoJS.AES.encrypt('secretData', 'your-key').toString(); uni.setStorageSync('encryptedToken', encrypted); // 解密读取 const bytes = CryptoJS.AES.decrypt(encrypted, 'your-key'); const originalData = bytes.toString(CryptoJS.enc.Utf8); ``` 2. **多页面数据同步问题** **现象**:A 页面修改数据后,B 页面未及时更新 **方案**:通过全局事件总线或 Vuex 通知更新 ```javascript // 存储并触发事件 uni.setStorageSync('theme', 'dark'); uni.$emit('themeChange', 'dark'); // 其他页面监听 uni.$on('themeChange', (theme) => { this.theme = theme; }); ``` 3. **低版本安卓兼容性** **问题**:安卓 4.4 以下系统 WebView 对 `localStorage` 支持不稳定 **方案**: - 使用 `uni.setStorage` 异步 API 替代 - 降级存储方案(如 SQLite 插件) --- #### 四、性能优化建议 1. **避免主线程阻塞** - 大数据存储使用异步 API: ```javascript uni.setStorage({ key: 'bigData', data: hugeArray, success: () => console.log('存储完成') }); ``` 2. **键名命名规范** ```javascript // 推荐:统一前缀 + 业务语义 const ANDROID_KEYS = { USER_CACHE: 'android_user_v1', CONFIG: 'android_config' }; ``` 3. **定期清理策略** ```javascript // 示例:清理 7 天前的缓存 const cleanExpiredData = () => { const keys = uni.getStorageInfoSync().keys; keys.forEach(key => { const data = JSON.parse(uni.getStorageSync(key)); if (data.expire && data.expire < Date.now()) { uni.removeStorageSync(key); } }); }; ``` --- #### 五、调试技巧 1. **查看安卓端存储内容** - 通过 `adb` 命令导出数据库文件: ```bash adb pull /data/data/[应用包名]/app_webview/Local Storage . ``` - 使用 SQLite 工具查看 `.localstorage` 文件 2. **日志监控** ```javascript // 封装带日志的存储方法 function debugSetStorage(key, value) { console.log('[Storage] 写入:', key, value); try { uni.setStorageSync(key, value); } catch (e) { console.error('[Storage] :', e); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值