空安全编程的典范:Java 8中的安全应用指南

article/2025/6/18 3:07:11

在这里插入图片描述

文章目录

    • 一、Base64 编码解码
      • 1.1 基本的编码和解码
      • 1.2 URL 和文件名安全的编码解码器
      • 1.3 MIME Base64编码和解码
    • 二、Optional类
    • 三、Nashorn JavaScript

一、Base64 编码解码

1.1 基本的编码和解码

  1. Base64 编码
    • 使用 Base64.getEncoder().encodeToString(originalInput.getBytes()) 对原始字符串进行编码。
    • Base64.getEncoder() 返回一个 Base64.Encoder 实例,调用 encodeToString() 方法将原始字符串的字节数组编码为Base64字符串。
  2. Base64 解码
    • 使用 Base64.getDecoder().decode(encodedString) 对Base64编码后的字符串进行解码。
    • Base64.getDecoder() 返回一个 Base64.Decoder 实例,调用 decode() 方法将Base64编码后的字符串解码为原始的字节数组。
    • 使用 new String(decodedBytes) 将解码后的字节数组转换为字符串。
  3. 注意事项:
    • 在实际应用中,确保使用相同的编码和解码方法,以避免数据损坏或不正确的解码结果。
    • Java 8 中的 java.util.Base64 类提供了方便且高效的Base64编码和解码功能,适用于处理字符串数据的安全传输和存储。
public static void main(String[] args) {// 原始字符串String originalInput = "Hello World!";// 编码为Base64String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());System.out.println("Encoded string: " + encodedString);// 解码Base64byte[] decodedBytes = Base64.getDecoder().decode(encodedString);String decodedString = new String(decodedBytes);System.out.println("Decoded string: " + decodedString);}// 输出
Encoded string: SGVsbG8gV29ybGQh
Decoded string: Hello World!

1.2 URL 和文件名安全的编码解码器

  1. URL 和文件名安全的 Base64 编码
    • 使用 Base64.getUrlEncoder().encodeToString(originalInput.getBytes("utf-8")) 对原始字符串进行URL和文件名安全的Base64编码。
    • Base64.getUrlEncoder() 返回一个 Base64.Encoder 实例,调用 encodeToString() 方法将原始字符串的字节数组编码为URL和文件名安全的Base64字符串。
  2. URL 和文件名安全的 Base64 解码
    • 使用 Base64.getUrlDecoder().decode(encodedString) 对URL和文件名安全的Base64编码后的字符串进行解码。
    • Base64.getUrlDecoder() 返回一个 Base64.Decoder 实例,调用 decode() 方法将Base64编码后的字符串解码为原始的字节数组。
    • 使用 new String(decodedBytes, "utf-8") 将解码后的字节数组转换为字符串。
  3. 注意事项:
    • URL 和文件名安全的Base64编码会使用 - 替换 +,并且使用 _ 替换 /,以确保编码结果可以安全地在URL和文件名中使用。
    • 如果使用的是不同的字符集编码(例如 utf-8),请确保在编码和解码过程中使用相同的字符集,以避免数据损坏或不正确的解码结果。
public static void main(String[] args) throws UnsupportedEncodingException {// 原始字符串String originalInput = "Hello World!";// URL 和文件名安全的 Base64 编码String encodedString = Base64.getUrlEncoder().encodeToString(originalInput.getBytes("utf-8"));System.out.println("Encoded string (URL safe): " + encodedString);// 解码 URL 和文件名安全的 Base64byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedString);String decodedString = new String(decodedBytes, "utf-8");System.out.println("Decoded string: " + decodedString);}// 输出
Encoded string (URL safe): SGVsbG8gV29ybGQh
Decoded string: Hello World!

1.3 MIME Base64编码和解码

MIME Base64编码与普通的Base64编码在行尾添加换行符,以便在电子邮件等MIME(Multipurpose Internet Mail Extensions)环境中进行传输。

  1. MIME Base64 编码
    • 使用 Base64.getMimeEncoder().encodeToString(originalInput.getBytes("utf-8")) 对原始字符串进行MIME Base64编码。
    • Base64.getMimeEncoder() 返回一个 Base64.Encoder 实例,调用 encodeToString() 方法将原始字符串的字节数组编码为MIME Base64字符串。
  2. MIME Base64 解码
    • 使用 Base64.getMimeDecoder().decode(encodedString) 对MIME Base64编码后的字符串进行解码。
    • Base64.getMimeDecoder() 返回一个 Base64.Decoder 实例,调用 decode() 方法将MIME Base64编码后的字符串解码为原始的字节数组。
    • 使用 new String(decodedBytes, "utf-8") 将解码后的字节数组转换为字符串。
  3. 注意事项:
    • MIME Base64编码会在每行末尾添加换行符 \r\n,以便适应电子邮件等格式要求。
    • 如果使用的是不同的字符集编码(例如 utf-8),请确保在编码和解码过程中使用相同的字符集,以避免数据损坏或不正确的解码结果。
public static void main(String[] args) throws UnsupportedEncodingException {// 原始字符串String originalInput = "Hello World!";// MIME Base64 编码String encodedString = Base64.getMimeEncoder().encodeToString(originalInput.getBytes("utf-8"));System.out.println("Encoded string (MIME):" + encodedString);// 解码 MIME Base64byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedString);String decodedString = new String(decodedBytes, "utf-8");System.out.println("Decoded string: " + decodedString);}// 输出
Encoded string (MIME):SGVsbG8gV29ybGQh
Decoded string: Hello World!

二、Optional类

java.util.Optional 类是用来处理可能为null的值的容器。提供了一种优雅的方式来避免 NullPointerException,并且可以更清晰地表达某个值可能不存在的情况。

  1. 创建 Optional 对象

    • Optional.of(value):如果 value 不为 null,则创建一个包含指定值的 Optional 对象;如果 value 为 null,则会抛出 NullPointerException
    • Optional.ofNullable(value):无论 value 是否为 null,都会创建一个对应的 Optional 对象。如果 value 是 null,则创建一个空的 Optional 对象。
  2. 检查是否有值

    • isPresent() :检查 Optional 对象中是否包含值。
  3. 获取值

    • get():如果 Optional 对象中有值,则返回该值;否则抛出 NoSuchElementException
  4. 处理空值

    • orElse(defaultValue):如果 Optional 对象中有值,则返回该值;否则返回 defaultValue
    • orElseGet(Supplier):如果 Optional 对象中有值,则返回该值;否则调用 Supplier 提供的方法来获取默认值。
  5. 条件操作

    • ifPresent() :在 Optional 对象非空时执行特定操作。
  6. 过滤值

    • filter() 方法过滤 Optional 对象中的值。
  7. 映射值

    • map()flatMap() :对 Optional 对象中的值进行映射操作。
public static void main(String[] args) {// 创建一个包含非空值的 Optional 对象Optional<String> optional1 = Optional.of("Hello");System.out.println("Optional 1 value: " + optional1.get());// 创建一个可能为 null 的 Optional 对象String nullableValue = null;Optional<String> optional2 = Optional.ofNullable(nullableValue);System.out.println("Optional 2 is present? " + optional2.isPresent());// 获取 Optional 对象中的值String value = optional1.get();System.out.println("Value: " + value);// 检查 Optional 对象中是否有值if (optional1.isPresent()) {System.out.println("Optional contains value.");} else {System.out.println("Optional is empty.");}// 使用 orElse 提供默认值String result1 = optional2.orElse("Default Value");System.out.println("Result 1: " + result1);// 使用 orElseGet 提供默认值String result2 = optional2.orElseGet(() -> {// 处理逻辑,返回默认值return "Default Value from Supplier";});System.out.println("Result 2: " + result2);// 如果 Optional 对象中有值,则执行操作optional1.ifPresent(val -> System.out.println("Value is present: " + val));// 过滤值Optional<String> filteredOptional = optional1.filter(val -> val.startsWith("H"));System.out.println("Filtered Optional value: " + filteredOptional.orElse("Not found"));// 映射值Optional<String> transformedOptional = optional1.map(val -> val.toUpperCase());System.out.println("Transformed Optional value: " + transformedOptional.orElse("No value"));// 抛出异常try {value = optional2.orElseThrow(() -> new IllegalArgumentException("Value is required."));System.out.println("Value: " + value);} catch (IllegalArgumentException e) {System.out.println("Exception: " + e.getMessage());}}// 输出
Optional 1 value: Hello
Optional 2 is present? false
Value: Hello
Optional contains value.
Result 1: Default Value
Result 2: Default Value from Supplier
Value is present: Hello
Filtered Optional value: Hello
Transformed Optional value: HELLO
Exception: Value is required.

三、Nashorn JavaScript

Java 8 引入了 Nashorn 作为新的 JavaScript 引擎,用于替代旧版的 Rhino 引擎,可以在 Java 应用程序中执行 JavaScript 代码。Nashorn 通过优化和与 Java 的本地集成提供了更好的性能。

  1. 执行内联脚本:
public static void main(String[] args) throws Exception {// 创建 Nashorn 脚本引擎ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");// 执行 JavaScript 代码engine.eval("print('Hello Nashorn!')");
}
  1. 传递变量:
public static void main(String[] args) throws Exception {ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");// 将 Java 变量传递给 JavaScriptengine.put("name", "Alice");engine.eval("print('Hello, ' + name + '!')");
}
  1. 高级特性
    • Java 互操作性: JavaScript 代码可以直接与 Java 类和对象交互。
    • 函数式编程: Nashorn 支持 lambda 表达式和流式 API,使其更符合现代 JavaScript 标准。
    • 性能: 由于其现代化设计和优化技术,Nashorn 通常比 Rhino 更快。
// Java 类
public class Person {public String getName() {return "Alice";}
}// JavaScript 代码
engine.eval("var person = new Person(); print(person.getName());");
  1. 命令行工具
    • Nashorn 还配备了一个命令行工具 (jjs),用于直接从终端执行 JavaScript 文件,这对于测试和调试非常有用。
$ jjs script.js
  1. 与 Java 应用程序集成:
    • 可以将 Nashorn 集成到 Java 应用程序中,用于脚本支持、规则引擎和动态行为等多种用途。
    • 提供了在 Java 的稳健性和 JavaScript 的脚本能力之间进行灵活结合的能力。

懒惰也是天生的,勤奋需自己努力,一放松就懒了


http://www.hkcw.cn/article/DTQdXfFmEe.shtml

相关文章

信息安全意识之安全组织架构图

一、信息安全技术概论1.网络在当今社会中的重要作用2.信息安全的内涵 网络出现前&#xff1a;主要面向数据的安全&#xff0c;对信息的机密性、完整性和可用性的保护&#xff0c;即CIA三元组 网络出现后&#xff0c;还涵盖了面向用户的安全&#xff0c;即鉴别&#xff0c;授权&…

CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~

汇总结果来源&#xff1a;CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开&#xff0c;则说明还未公布&#xff0c;在公布后笔者会及时添加. 若笔者未及时添加&#xff0c;欢迎读者告知. 文章根据题目关键词搜索&#xff0c;可能会有遗漏. 若笔者出现…

MySQL 表结构变更优化:如何安全添加字段而不阻塞业务?

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务) &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1;个人微信&a…

手把手教你安全删除Anaconda虚拟环境(避坑指南)

文章目录 一、删除前必看清单&#xff08;超级重要&#xff09;二、三种删除方法对比&#xff08;建议收藏&#xff09;方法1&#xff1a;官方推荐命令&#xff08;最安全&#xff09;方法2&#xff1a;暴力删除大法&#xff08;快速但需谨慎&#xff09;方法3&#xff1a;核弹…

Nacos 日志与 Raft 数据清理指南:如何安全释放磁盘空间

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务) &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1;个人微信&a…

从概念表达到安全验证:智能驾驶功能迎来系统性规范

随着辅助驾驶事故频发&#xff0c;监管机制正在迅速补位。面对能力表达、使用责任、功能部署等方面的新要求&#xff0c;行业开始重估技术边界与验证能力&#xff0c;数字样机正成为企业合规落地的重要抓手。 2025年以来&#xff0c;围绕智能驾驶功能的争议不断升级。多起因辅…

OpenHarmony子系统开发 - 安全(八)

OpenHarmony SELinux开发指导&#xff08;一&#xff09; 一、OpenHarmony SELinux概述 简介 OpenHarmony结合系统架构特点&#xff0c;基于安全增强式Linux&#xff08;Security-Enhanced Linux &#xff0c;以下简称SELinux&#xff09;对OpenHarmony操作系统内文件、参数…

三亚女子被毒蛇咬伤身亡 医院正调查 血清储备引关注

6月3日,海南三亚一名女子因被毒蛇咬伤送医治疗后不幸身亡的消息引起了广泛关注。据死者家属李先生透露,他的姐姐是在6月1日晚被毒蛇咬伤后送往三亚中心医院救治的。目前,该医院正在对此事进行调查。三亚市医调委表示,三亚仅有少数几家医院储备了抗蛇毒血清,并且在被毒蛇咬…

电视机不看也要买的原因是什么?

电视机不看也要买的原因主要包括以下几点‌:‌娱乐选择多样化‌:现代的智能电视不仅可以通过连接互联网享受各种流媒体服务、游戏和在线内容,还能提供丰富的娱乐选择。即使不经常看电视节目,电视机也能成为家庭娱乐的中心,满足多样化的娱乐需求‌。‌社交活动‌:拥有一台…

外交部回应蒙古国总理被解职 不作评论

6月3日,外交部发言人林剑主持例行记者会。有外媒记者提问关于蒙古国国家大呼拉尔决定解除总理奥云额尔登职务一事。林剑表示,这是蒙古国内政,不予评论。责任编辑:0764

华为云Flexus+DeepSeek征文|利用华为云 Flexus 云服务一键部署 Dify 平台开发文本转语音助手全流程实践

目录 前言 1 华为云 Flexus 与 Dify 平台简介 1.1 Flexus&#xff1a;为AI而生的轻量级云服务 1.2 Dify&#xff1a;开源的LLM应用开发平台 2 一键部署Dify平台至Flexus环境 3 构建文本转语音助手应用 3.1 创建ChatFlow类型应用 3.2 配置语音合成API的HTTP请求 3.3 设…

俄称俄乌领导人或在伊斯坦布尔会晤 谈判地点成焦点

俄罗斯和乌克兰两国代表团在土耳其伊斯坦布尔就和平解决俄乌冲突举行了第二轮直接谈判。据俄罗斯方面消息,俄罗斯代表团搭乘的飞机已起飞返回莫斯科。有消息称,俄乌两国领导人可能在伊斯坦布尔举行会晤,但具体时间尚未确定。此外,第三轮谈判也可能在伊斯坦布尔进行。责任编…

尹锡悦夫妇现身投票站笑着回避提问 金建希53天后首露面

6月3日,韩国举行了第21届总统选举投票。当天上午,前总统尹锡悦及其夫人金建希在安保人员陪同下前往首尔瑞草区元明小学投票站完成投票。这是金建希自4月11日从总统官邸搬离后首次公开露面。投票结束后,尹锡悦没有回答关于何时接受检方调查、为何拒绝配合调查以及因弹劾提前大…

太逼真!机器人“唐伯虎”亮相武汉,面部毛孔清晰可见

6月2日,世界机器人嘉年华在武汉火热举行,现场一个以唐伯虎为原型的机器人吸引了观众注意。据了解,这款仿生机器人是由江苏云幕智造打造,机器人脸部和手部都由硅胶材质一比一根据古籍图画资料还原,拟真程度极高,触摸“唐伯虎”的皮肤,还有如真人肌肤般的弹性。唐伯虎款人…

专家:乌袭击行动已达到俄动核条件

6月1日,乌克兰安全局宣布对俄罗斯多处机场进行了无人机袭击,并将此次行动称为“史诗级胜利”,代号为“蜘蛛网”。乌克兰方面将这次行动与以色列突袭乌干达恩陪德机场的行动相提并论。据称,此次行动由泽连斯基亲自指挥,最远袭击的机场位于俄罗斯远东地区,距离乌克兰4000公…

警方回应河中打捞起80万现金 实为影视道具

5月27日,有网民发布消息称重庆永川一名环卫工人在河沟中打捞起80万元现金,此事引起了广泛关注。经调查核实,所谓的“现金”实际上是影视拍摄用的道具纸币。当天上午9时20分左右,永川警方接到河道清理人员报警,称在清理过程中发现一个疑似装有现金的快递包裹。政务110出警组…

Docker运行hello-world镜像失败或超时

docker run hello-world时超时告警 ​ 跟着官方文档进行docker安装时&#xff0c;测试docker是否运行成功执行docker run hello-world时&#xff0c;结果和别人的不一样 正常情况&#xff1a; 我们的&#xff1a; Unable to find image hello-world:latest locally latest…

Spark 架构超简单入门:一张图看懂核心组件

如果你是第一次接触 Spark&#xff0c;看到架构图中的英文术语&#xff08;比如 Driver、Executor&#xff09;可能会一头雾水。别担心&#xff01;本文将用最直白的语言&#xff0c;带你轻松理解 Spark 的工作原理。不需要任何编程基础&#xff0c;跟着我一起看下去吧&#xf…

Windows 系统下安装 RabbitMQ 的详细指南

Windows 系统下安装 RabbitMQ 的详细指南 Windows 系统下安装 RabbitMQ 的详细指南1. 前言2. 安装前的准备3. 安装步骤3.1 下载并安装 Erlang3.2 下载并安装 RabbitMQ3.3 配置环境变量3.4 验证安装3.5 启用 RabbitMQ 管理插件 4. 常见问题解决4.1 RabbitMQ 服务无法启动4.2 无法…

Kappa架构:简化大数据实时流处理的创新方案

目录 前言1. 什么是Kappa架构&#xff1f;2. Kappa架构的特点2.1 简化架构2.2 统一的数据流处理2.3 强调数据的持久化和回溯2.4 实时数据处理 3. Kappa架构的组成部分3.1 数据流3.2 流处理引擎3.3 持久化存储3.4 数据日志 4. Kappa架构的适用场景4.1 实时数据分析4.2 事件驱动架…