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

文章目录
- 一、Base64 编码解码
- 1.1 基本的编码和解码
- 1.2 URL 和文件名安全的编码解码器
- 1.3 MIME Base64编码和解码
- 二、Optional类
- 三、Nashorn JavaScript
一、Base64 编码解码
1.1 基本的编码和解码
- Base64 编码:
- 使用
Base64.getEncoder().encodeToString(originalInput.getBytes())对原始字符串进行编码。 Base64.getEncoder()返回一个Base64.Encoder实例,调用encodeToString()方法将原始字符串的字节数组编码为Base64字符串。
- 使用
- Base64 解码:
- 使用
Base64.getDecoder().decode(encodedString)对Base64编码后的字符串进行解码。 Base64.getDecoder()返回一个Base64.Decoder实例,调用decode()方法将Base64编码后的字符串解码为原始的字节数组。- 使用
new String(decodedBytes)将解码后的字节数组转换为字符串。
- 使用
- 注意事项:
- 在实际应用中,确保使用相同的编码和解码方法,以避免数据损坏或不正确的解码结果。
- 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 和文件名安全的编码解码器
- URL 和文件名安全的 Base64 编码:
- 使用
Base64.getUrlEncoder().encodeToString(originalInput.getBytes("utf-8"))对原始字符串进行URL和文件名安全的Base64编码。 Base64.getUrlEncoder()返回一个Base64.Encoder实例,调用encodeToString()方法将原始字符串的字节数组编码为URL和文件名安全的Base64字符串。
- 使用
- URL 和文件名安全的 Base64 解码:
- 使用
Base64.getUrlDecoder().decode(encodedString)对URL和文件名安全的Base64编码后的字符串进行解码。 Base64.getUrlDecoder()返回一个Base64.Decoder实例,调用decode()方法将Base64编码后的字符串解码为原始的字节数组。- 使用
new String(decodedBytes, "utf-8")将解码后的字节数组转换为字符串。
- 使用
- 注意事项:
- URL 和文件名安全的Base64编码会使用
-替换+,并且使用_替换/,以确保编码结果可以安全地在URL和文件名中使用。 - 如果使用的是不同的字符集编码(例如
utf-8),请确保在编码和解码过程中使用相同的字符集,以避免数据损坏或不正确的解码结果。
- URL 和文件名安全的Base64编码会使用
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)环境中进行传输。
- MIME Base64 编码:
- 使用
Base64.getMimeEncoder().encodeToString(originalInput.getBytes("utf-8"))对原始字符串进行MIME Base64编码。 Base64.getMimeEncoder()返回一个Base64.Encoder实例,调用encodeToString()方法将原始字符串的字节数组编码为MIME Base64字符串。
- 使用
- MIME Base64 解码:
- 使用
Base64.getMimeDecoder().decode(encodedString)对MIME Base64编码后的字符串进行解码。 Base64.getMimeDecoder()返回一个Base64.Decoder实例,调用decode()方法将MIME Base64编码后的字符串解码为原始的字节数组。- 使用
new String(decodedBytes, "utf-8")将解码后的字节数组转换为字符串。
- 使用
- 注意事项:
- MIME Base64编码会在每行末尾添加换行符
\r\n,以便适应电子邮件等格式要求。 - 如果使用的是不同的字符集编码(例如
utf-8),请确保在编码和解码过程中使用相同的字符集,以避免数据损坏或不正确的解码结果。
- MIME Base64编码会在每行末尾添加换行符
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,并且可以更清晰地表达某个值可能不存在的情况。
-
创建 Optional 对象
Optional.of(value):如果value不为 null,则创建一个包含指定值的 Optional 对象;如果value为 null,则会抛出NullPointerException。Optional.ofNullable(value):无论value是否为 null,都会创建一个对应的 Optional 对象。如果value是 null,则创建一个空的 Optional 对象。
-
检查是否有值
isPresent():检查 Optional 对象中是否包含值。
-
获取值
get():如果 Optional 对象中有值,则返回该值;否则抛出NoSuchElementException。
-
处理空值
orElse(defaultValue):如果 Optional 对象中有值,则返回该值;否则返回defaultValue。orElseGet(Supplier):如果 Optional 对象中有值,则返回该值;否则调用Supplier提供的方法来获取默认值。
-
条件操作
ifPresent():在 Optional 对象非空时执行特定操作。
-
过滤值
filter()方法过滤 Optional 对象中的值。
-
映射值
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 的本地集成提供了更好的性能。
- 执行内联脚本:
public static void main(String[] args) throws Exception {// 创建 Nashorn 脚本引擎ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");// 执行 JavaScript 代码engine.eval("print('Hello Nashorn!')");
}
- 传递变量:
public static void main(String[] args) throws Exception {ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");// 将 Java 变量传递给 JavaScriptengine.put("name", "Alice");engine.eval("print('Hello, ' + name + '!')");
}
- 高级特性:
- 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());");
- 命令行工具:
- Nashorn 还配备了一个命令行工具 (
jjs),用于直接从终端执行 JavaScript 文件,这对于测试和调试非常有用。
- Nashorn 还配备了一个命令行工具 (
$ jjs script.js
- 与 Java 应用程序集成:
- 可以将 Nashorn 集成到 Java 应用程序中,用于脚本支持、规则引擎和动态行为等多种用途。
- 提供了在 Java 的稳健性和 JavaScript 的脚本能力之间进行灵活结合的能力。
懒惰也是天生的,勤奋需自己努力,一放松就懒了
相关文章:
空安全编程的典范:Java 8中的安全应用指南
文章目录 一、Base64 编码解码1.1 基本的编码和解码1.2 URL 和文件名安全的编码解码器1.3 MIME Base64编码和解码 二、Optional类三、Nashorn JavaScript 一、Base64 编码解码 1.1 基本的编码和解码 Base64 编码: 使用 Base64.getEncoder().encodeToString(origin…...
Docker Machine 深入解析
Docker Machine 深入解析 引言 Docker Machine 是 Docker 生态系统中的一个重要工具,它简化了 Docker 容器环境的配置和管理过程。本文将深入探讨 Docker Machine 的概念、功能、使用场景以及如何在实际环境中高效利用它。 什么是 Docker Machine? Docker Machine 是一个…...
20.x86游戏实战-远线程注入的实现
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...
06MFC之对话框--重绘元文件
文章目录 实现示例展示需要绘制的窗口/位置控件位置更新下一次示例粗细滑动部分更新重绘元文件(窗口变化内容消失)方法一:使用元文件方法二:兼容设备方法三:使用自定义类存储绘图数据除画笔外功能处理画笔功能处理保存前面画的线及色彩实现示例展示 需要绘制的窗口/位置 …...
鼠标的发明和鼠标“变形记”
注:机翻,未校对。 Who Invented the Computer Mouse? 谁发明了电脑鼠标? It was technology visionary and inventor Douglas Engelbart (January 30, 1925 – July 2, 2013) who revolutionized the way computers worked, turning it fr…...
快捷:通过胶水语言实现工作中测试流程并行、加速
通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景(背景)问题抽象(挑战)如何做(行动)获得了什么(结果)后记相关资源 通过胶水语言实现工…...
MySQL 和 PostgreSQL,我到底选择哪个?
MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统(RDBMS)。它们都具有强大的功能和广泛的社区支持,但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL,包括它们的特点、性能、扩展性、安全性以及适用场景等…...
Java —— 内部类
Java内部类 1.什么是内部类? 将一个类A定义在另一个类B里面,里面的类A就称为内部类(InnerClass),类B则称为外部类(OuterClass)。 2.为什么需要内部类? 具体来说,当一…...
高职院校人工智能人才培养成果导向系统构建、实施要点与评量方法
一、引言 近年来,人工智能技术在全球范围内迅速发展,对各行各业产生了深远的影响。高职院校作为培养高技能人才的重要基地,肩负着培养人工智能领域专业人才的重任。为了适应社会对人工智能人才的需求,高职院校需要构建一套科学、…...
ffmpeg中的超时控制
在FFmpeg库中,很多函数没有直接的参数可以设置超时。 那么有哪些函数可以通过设置 AVFormatContext 的 interrupt_callback 来实现超时控制? avformat_open_input: 打开输入文件或流。这个函数会阻塞,尤其是在网络流的情况下&…...
搜维尔科技:【研究】触觉技术将在5年内以8种方式改变人们的世界
触觉技术在过去几年中发展迅猛,大大提高了反馈的精确度和真实度。其应用产生了真正的影响,数百家公司和企业都集成了触觉技术来增强培训和研究模拟。 虽然触觉技术主要用于 B2B 层面,但触觉技术可能会彻底改变我们的生活,尤其是通…...
项目收获总结--MyBatis的知识收获
MyBatis的知识收获 一、概述二、获取自动生成的(主)键值三、将sql执行结果封装为目标返回对象的方式和原理四、延迟加载实现原理五、批量插入六、自带分页与分页插件原理七、Mapper(Dao)接口与XML映射文件关系八、模糊查询like语句九、#{}和${}的区别十、二级缓存案例实战 一、…...
数据库管理-第221期 Oracle的高可用-04(20240717)
数据库管理221期 2024-07-17 数据库管理-第221期 Oracle的高可用-04(20240717)1 ADG2 连接配置2.1 TNS2.2 JDBC2.3 JAVA连接池2.3.1 Oracle UCP2.3.2 应用连接池基础配置 总结 数据库管理-第221期 Oracle的高可用-04(20240717) 作…...
navicat15已连接忘记密码
1.导出链接 2.使用文本打开 connections.ncx UserName"root" PasswordXXXX 3.复制加密密码,在线解密 代码在线运行 - 在线工具 php解密代码 <?php class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected…...
企业管理必备:学会寻找客户绝佳方法。
无论是日常沟通、工作交流,还是社交娱乐,微信都扮演着重要的角色。而在微信的使用过程中,添加好友是一项基本而重要的操作,但是您真的会添加微信好友吗? 试试这个神器——微信管理系统,下面分享它快速加客…...
昇思25天学习打卡营第29天 | 文本解码原理--以MindNLP为例
今天是29天,学习了文本解码原理--以MindNLP为例。 MindNLP 是一个基于 MindSpore 的开源自然语言处理(NLP)库。它具有以下特点: 支持多种 NLP 任务:如语言模型、机器翻译、问答、情感分析、序列标记、摘要等ÿ…...
元服务体验-服务发现
服务发现,无论线上或线下的方式都可以发现元服务。 线上:基于用户意图。从精准意图的搜索、用户事件触发的推荐到主动探索等场景。用户可以在设备的负一屏、全局搜索、应用市场、桌面等场景发现元服务。 线下:用户在 HarmonyOS Connect标签…...
设计模式学习(二)工厂模式——抽象工厂模式+注册表
设计模式学习(二)工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…...
同三维T80004解码器视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清HDMI解码器,双路4K超高清解码器
同三维T80004解码器视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清HDMI解码器,双路4K超高清解码器 同三维T80004解码器系列视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清H…...
Flutter应用开发:掌握StatefulWidget的实用技巧
前言 随着移动应用的日益复杂,状态管理成为了 Flutter 应用开发中的一项重要挑战。 状态,即应用中的可变数据,它驱动着用户界面的渲染和交互。 在 Flutter 这样的声明式 UI 框架中,如何高效、可维护地管理状态,对于…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
