空安全编程的典范: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!";

        // 编码为Base64
        String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());
        System.out.println("Encoded string: " + encodedString);

        // 解码Base64
        byte[] 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 和文件名安全的 Base64
        byte[] 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 Base64
        byte[] 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 变量传递给 JavaScript
   engine.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 的脚本能力之间进行灵活结合的能力。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/799370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32嵌入式系统设计与开发---拓展】——1_8_寄存器的理解

1、寄存器的理解 &#xff08;1&#xff09;MOS管 MOS管是一种场效应晶体管&#xff0c;通过控制栅极电压来调节漏极和源极之间的电流&#xff0c;常用于电子开关和放大器电路中。 MOS管就像是电子开关&#xff0c;可以通过控制一个小电压来打开或关闭一个大电流&#xff0c;常…

小程序-1(项目结构+代码结构+宿主环境+组件)

目录 1.小程序简介 2.小程序的项目结构 小程序的基本组成结构 小程序的页面组成部分 json配置文件的作用 app.json文件 project.config.json文件 sitemap.json文件 页面的.json文件 新建小程序页面 修改项目首页 3.小程序的代码结构 wxml和html的区别 wxss和css的…

数据结构(Java):LinkedList集合Stack集合

1、集合类LinkedList 1.1 什么是LinkedList LinkedList的底层是一个双向链表的结构&#xff08;故不支持随机访问&#xff09;&#xff1a; 在LinkedList中&#xff0c;定义了first和last&#xff0c;分别指向链表的首节点和尾结点。 每个节点中有一个成员用来存储数据&…

postgresql简单导出数据与手动本地恢复(小型数据库)

问题 需要每天手动备份postgresql。 步骤 导出数据 /opt/homebrew/opt/postgresql16/bin/pg_dump --file/Users/zhangyalin/backup_sql/<IP地址>_pg-2024_07_15_17_30_15-dump.sql --dbname<数据库名> --username<用户名> --host<IP地址> --port54…

Python array的特点及使用

1、Python array的特点及使用 1.1、python array为什么只能接收指定类型数据 array 模块提供了一种叫做 array 的数据结构&#xff0c;它表示一块连续的内存空间&#xff0c;所有的元素必须是相同的类型。这是因为在内存中&#xff0c;数组元素存储在连续的位置上&#xff0c…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 游乐园门票 (200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 最新华为O…

数据结构java笔记

线性表 数组 物理地址连续、逻辑地址连续。数组长度是固定的&#xff0c;不能动态增长或缩小&#xff0c;数组中元素的类型相同&#xff08;适合用于元素个数固定&#xff0c;且快速用下标访问&#xff09; ArrayList&#xff08;动态数组&#xff09; 物理地址连续、逻辑地…

【C++练级之路】【Lv.26】类型转换

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、C风格类型转换1.1 隐式类型转换1.2 显式类型转换 二、C风格类型转换2.1 static_cast2.2 dynamic_cast2.3…

【C++】—— 初识C++

【C】—— 初识C 一、什么是 C二、C 的发展历史三、C 版本更新四、C 的重要性五、C 在工作领域中的运用六、C 书籍推荐&#xff1a; 一、什么是 C C语言 是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要…

【eNSP模拟实验】单臂路由实现VLAN间通信

实验需求 如下图所示&#xff0c;辅导员办公室需要访问处在不同vlan的学生管理服务器的文件&#xff0c;那么如何实现两台终端相互通信呢&#xff1f;我们可以使用单臂路由的方式来实现。 单臂路由&#xff08;router-on-a-stick&#xff09;是指在路由器的一个接口上通过配置…

小型医疗门诊挂号收费后台系统源码 医院管理系统后台thinkphp内核源码(带微信登录)

源码简介&#xff1a; 好用的小型医疗门诊后台管理系统的源码&#xff0c;就是那种医院管理用的&#xff0c;核心是用thinkphp做的。这个系统源码啊&#xff0c;功能多&#xff0c;用起来也方便。它还支持第三方配置和微信登录。 这玩意儿是基于ThinkPHP搞出来的医疗门诊系统…

AJAX知识点(详解)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Flowable-流程图标与流程演示

BPMN 2.0是业务流程建模符号2.0的缩写。它由Business Process Management Initiative这个非营利协会创建并不断发展。作为一种标识&#xff0c;BPMN 2.0是使用一些符号来明确业务流程设计流程图的一整套符号规范&#xff0c;它能增进业务建模时的沟通效率。目前BPMN2.0是最新的…

持续集成01--Git版本管理及基础应用实践

前言 本系列文章旨在深入探讨持续集成/持续部署&#xff08;Continuous Integration/Continuous Deployment, CI/CD&#xff09;流程中的各个环节&#xff0c;而本篇将聚焦于Git版本管理及其基本应用。通过本文&#xff0c;读者将了解到Git的基本原理、安装配置、基本命令以及如…

高校动作捕捉与数字人开发实训室方案:助推高校开设虚拟数字人微专业

目前一些学校除了传统的实训室建设之外&#xff0c;部分院校会建设一些“微专业”&#xff0c;专业方向与AIGC以及虚拟数字人有关&#xff0c;通过引进一些虚拟数字人以及全身动作捕捉设备相关的产品和系统工具&#xff0c;进行设计课程方案&#xff0c;比如虚拟人直播&#xf…

Vue3学习体验(一)

搭建工程 使用vue-cli脚手架创建vue3工程 vue create vue3-app-vue-cliVue-cli官网&#xff1a;https://cli.vuejs.org/zh/guide/installation.html 使用vite搭建vue3工程 npm init表示临时的下载vite应用来创建vue3工程&#xff0c;工程名称为vue3-app-vite npm init vit…

银河麒麟高级服务器操作系统V10加固操作指南

1:检查系统openssh安全配置: 2:检查是否设置口令过期前警告天数: 3:检查账户认证失败次数限制: 修改/etc/pam.d/system-auth文件中deny的参数即可 4:检查是否配置SSH方式账户认证失败次数限制:

SAP DR创建借项凭证简介

DR创建借项凭证简介 创建借项凭证请求的详细步骤1. 进入创建销售订单的界面2. 选择销售凭证类型3. 输入销售组织数据4. 输入客户和参考数据5. 添加项目明细6. 检查和保存创建实际的借项凭证借项凭证后台配置定义凭证类型定义项目类别定义销售开票类型借项凭证请求的业务意义跟踪…

@RequestBody注解的使用及源码解析

前言 RequestBody 注解是我们进行JavaEE开发&#xff0c;最常见的几个注解之一&#xff0c;这篇博文我们以案例和源码相结合&#xff0c;帮助大家更好的了解 RequestBody 注解 使用案例 1.自定义实体类 Data NoArgsConstructor AllArgsConstructor public class User {priv…

非对称加解密和签名

非对称加解密特点 一对密钥&#xff0c;公钥和私钥。私钥自己持有&#xff0c;公钥公开给通信的对方。 如果公钥用作加密&#xff0c;那么私钥用作解密。 如果私钥用做加密&#xff0c;那么公钥用作解密。 如果数据量少可用非对称加密算法直接加密。 如果数据量大&#xff0c;…