当前位置: 首页 > news >正文

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

在这里插入图片描述

文章目录

    • 一、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 的脚本能力之间进行灵活结合的能力。

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

相关文章:

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

文章目录 一、Base64 编码解码1.1 基本的编码和解码1.2 URL 和文件名安全的编码解码器1.3 MIME Base64编码和解码 二、Optional类三、Nashorn JavaScript 一、Base64 编码解码 1.1 基本的编码和解码 Base64 编码&#xff1a; 使用 Base64.getEncoder().encodeToString(origin…...

Docker Machine 深入解析

Docker Machine 深入解析 引言 Docker Machine 是 Docker 生态系统中的一个重要工具,它简化了 Docker 容器环境的配置和管理过程。本文将深入探讨 Docker Machine 的概念、功能、使用场景以及如何在实际环境中高效利用它。 什么是 Docker Machine? Docker Machine 是一个…...

20.x86游戏实战-远线程注入的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

06MFC之对话框--重绘元文件

文章目录 实现示例展示需要绘制的窗口/位置控件位置更新下一次示例粗细滑动部分更新重绘元文件(窗口变化内容消失)方法一:使用元文件方法二:兼容设备方法三:使用自定义类存储绘图数据除画笔外功能处理画笔功能处理保存前面画的线及色彩实现示例展示 需要绘制的窗口/位置 …...

鼠标的发明和鼠标“变形记”

注&#xff1a;机翻&#xff0c;未校对。 Who Invented the Computer Mouse? 谁发明了电脑鼠标&#xff1f; It was technology visionary and inventor Douglas Engelbart (January 30, 1925 – July 2, 2013) who revolutionized the way computers worked, turning it fr…...

快捷:通过胶水语言实现工作中测试流程并行、加速

通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景&#xff08;背景&#xff09;问题抽象&#xff08;挑战&#xff09;如何做&#xff08;行动&#xff09;获得了什么&#xff08;结果&#xff09;后记相关资源 通过胶水语言实现工…...

MySQL 和 PostgreSQL,我到底选择哪个?

MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;。它们都具有强大的功能和广泛的社区支持&#xff0c;但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL&#xff0c;包括它们的特点、性能、扩展性、安全性以及适用场景等…...

Java —— 内部类

Java内部类 1.什么是内部类&#xff1f; 将一个类A定义在另一个类B里面&#xff0c;里面的类A就称为内部类&#xff08;InnerClass&#xff09;&#xff0c;类B则称为外部类&#xff08;OuterClass&#xff09;。 2.为什么需要内部类&#xff1f; 具体来说&#xff0c;当一…...

高职院校人工智能人才培养成果导向系统构建、实施要点与评量方法

一、引言 近年来&#xff0c;人工智能技术在全球范围内迅速发展&#xff0c;对各行各业产生了深远的影响。高职院校作为培养高技能人才的重要基地&#xff0c;肩负着培养人工智能领域专业人才的重任。为了适应社会对人工智能人才的需求&#xff0c;高职院校需要构建一套科学、…...

ffmpeg中的超时控制

在FFmpeg库中&#xff0c;很多函数没有直接的参数可以设置超时。 那么有哪些函数可以通过设置 AVFormatContext 的 interrupt_callback 来实现超时控制&#xff1f; avformat_open_input&#xff1a; 打开输入文件或流。这个函数会阻塞&#xff0c;尤其是在网络流的情况下&…...

搜维尔科技:【研究】触觉技术将在5年内以8种方式改变人们的世界

触觉技术在过去几年中发展迅猛&#xff0c;大大提高了反馈的精确度和真实度。其应用产生了真正的影响&#xff0c;数百家公司和企业都集成了触觉技术来增强培训和研究模拟。 虽然触觉技术主要用于 B2B 层面&#xff0c;但触觉技术可能会彻底改变我们的生活&#xff0c;尤其是通…...

项目收获总结--MyBatis的知识收获

MyBatis的知识收获 一、概述二、获取自动生成的(主)键值三、将sql执行结果封装为目标返回对象的方式和原理四、延迟加载实现原理五、批量插入六、自带分页与分页插件原理七、Mapper(Dao)接口与XML映射文件关系八、模糊查询like语句九、#{}和${}的区别十、二级缓存案例实战 一、…...

数据库管理-第221期 Oracle的高可用-04(20240717)

数据库管理221期 2024-07-17 数据库管理-第221期 Oracle的高可用-04&#xff08;20240717&#xff09;1 ADG2 连接配置2.1 TNS2.2 JDBC2.3 JAVA连接池2.3.1 Oracle UCP2.3.2 应用连接池基础配置 总结 数据库管理-第221期 Oracle的高可用-04&#xff08;20240717&#xff09; 作…...

navicat15已连接忘记密码

1.导出链接 2.使用文本打开 connections.ncx UserName"root" PasswordXXXX 3.复制加密密码&#xff0c;在线解密 代码在线运行 - 在线工具 php解密代码 <?php class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected…...

企业管理必备:学会寻找客户绝佳方法。

无论是日常沟通、工作交流&#xff0c;还是社交娱乐&#xff0c;微信都扮演着重要的角色。而在微信的使用过程中&#xff0c;添加好友是一项基本而重要的操作&#xff0c;但是您真的会添加微信好友吗&#xff1f; 试试这个神器——微信管理系统&#xff0c;下面分享它快速加客…...

昇思25天学习打卡营第29天 | 文本解码原理--以MindNLP为例

今天是29天&#xff0c;学习了文本解码原理--以MindNLP为例。 MindNLP 是一个基于 MindSpore 的开源自然语言处理&#xff08;NLP&#xff09;库。它具有以下特点&#xff1a; 支持多种 NLP 任务&#xff1a;如语言模型、机器翻译、问答、情感分析、序列标记、摘要等&#xff…...

元服务体验-服务发现

服务发现&#xff0c;无论线上或线下的方式都可以发现元服务。 线上&#xff1a;基于用户意图。从精准意图的搜索、用户事件触发的推荐到主动探索等场景。用户可以在设备的负一屏、全局搜索、应用市场、桌面等场景发现元服务。 线下&#xff1a;用户在 HarmonyOS Connect标签…...

设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点&#xff1a;①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…...

同三维T80004解码器视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清HDMI解码器,双路4K超高清解码器

同三维T80004解码器视频使用操作说明书&#xff1a;高清HDMI解码器&#xff0c;高清SDI解码器&#xff0c;4K超清HDMI解码器&#xff0c;双路4K超高清解码器 同三维T80004解码器系列视频使用操作说明书&#xff1a;高清HDMI解码器&#xff0c;高清SDI解码器&#xff0c;4K超清H…...

Flutter应用开发:掌握StatefulWidget的实用技巧

前言 随着移动应用的日益复杂&#xff0c;状态管理成为了 Flutter 应用开发中的一项重要挑战。 状态&#xff0c;即应用中的可变数据&#xff0c;它驱动着用户界面的渲染和交互。 在 Flutter 这样的声明式 UI 框架中&#xff0c;如何高效、可维护地管理状态&#xff0c;对于…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...