java序列化对象,根据不同配置动态改变属性名

Jackson反序列化漏洞防御:Java开发者必须掌握的安全配置实践 JSON序列化与反序列化是现代Web应用和微服务架构中的基础技术,它实现了数据在客户端与服务器之间的高效传输。其核心原理是通过特定的数据格式转换规则,将内存中的对象结构转化为可传输的文本格式,反之亦然。这项技术的价值在于简化了跨平台数据交换,提升了系统间的互操作性。然而,在反序列化过程中,如果程序能够根据用户输入动态加载并实例化任意类,就可能引入严重的安全风险,例如远程代码执行(RCE)。这种风险在需要处理多态类型的业务场景中尤为突出。本文聚焦于Jackson库,深入剖析其反序列化漏洞的成因,并系统性地讲解 阅读详情

java序列化对象,根据不同配置动态改变属性名

使用场景:自己项目对接多个外部系统,各个外部系统使用的字段并没有统一,所以要根据不同系统动态的输出序列化数据,使适应各个系统的要求

实现方式

使用自定义注解和fastjson实现需求

fastjson的NameFilter的作用:序列化时,属性名变成自己指定的名称

实现过程

自定义注解一:MyParamName

package xin.yangshuai.cipher.json;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * MyParamName
 *
 * @author shuai
 * @date 2021/3/23
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface MyParamName {

    String value() default "";

    NameEle[] names() default {};
}
复制代码
value、names都是非必填
value:默认序列化的名称
names:自定义注解二,数组形式

自定义注解二:NameEle

package xin.yangshuai.cipher.json;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * NameEle
 *
 * @author shuai
 * @date 2021/3/24
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface NameEle {
    String id();
    String value();
}
复制代码
id:唯一标识,确定序列化后的属性名
value:定义序列化后的属性名

手写MyNameFilter,实现fastjson的NameFilter

package xin.yangshuai.cipher.json;

import com.alibaba.fastjson.serializer.NameFilter;

import java.lang.reflect.Field;

/**
 * MyNameFilter
 *
 * @author shuai
 * @date 2021/3/23
 */
public class MyNameFilter implements NameFilter {

    private String id;

    public MyNameFilter() {
    }

    public MyNameFilter(String id) {
        this.id = id;
    }

    @Override
    public String process(Object o, String name, Object value) {
        try {
            Field field = o.getClass().getDeclaredField(name);
            MyParamName myParamName = field.getDeclaredAnnotation(MyParamName.class);
            NameEle[] nameEles = myParamName.names();
            String defaultName = myParamName.value();
            if (nameEles.length == 0 && defaultName.length() > 0) {
                return defaultName;
            }
            for (NameEle n : nameEles) {
                if (id.equals(n.id())) {
                    return n.value();
                }
            }
        } catch (Exception e) {
            return name;
        }
        return name;
    }
}
复制代码

构造方法传递id属性的值,与自定义注解二的id进行匹配,匹配成功则使用对应的属性名

实体类,属性上添加自定义注解

package xin.yangshuai.cipher.json;

import com.alibaba.fastjson.JSON;

/**
 * Person
 *
 * @author shuai
 * @date 2021/3/23
 */
public class Person {

    @MyParamName(names = {
            @NameEle(id = "ln", value = "i_d"),
            @NameEle(id = "jl", value = "_id")})
    private String id;

    @MyParamName("NAME")
    private String name;

    private String age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
复制代码

运行主方法测试

public static void main(String[] args) {
    Person person = new Person();
    person.setAge("18");
    person.setId("001");
    person.setName("张三");

    String s = JSON.toJSONString(person, new MyNameFilter("jl"));
    System.out.println(s);

    String s1 = JSON.toJSONString(person, new MyNameFilter("ln"));
    System.out.println(s1);
}
复制代码

结果为:

{"age":"18","_id":"001","NAME":"张三"} {"age":"18","i_d":"001","NAME":"张三"}

ABtest描述统计功效 我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉 阅读详情

相关推荐

离线环境下 Ubuntu 22.04 制作自定义apt源 安装 Docker环境 的部署方案

本文介绍了一种在无外网环境下部署服务器项目的离线方案。通过在外网环境中制作包含APT软件包和Docker镜像的离线资源包,实现在内网环境中的完整部署。方案详细说明了离线APT源的制作方法、Docker镜像的导出/导入流程,以及内网服务器的软件安装和网络配置步骤。特别强调了版本一致性、目录结构规范和网络适配等注意事项,适用于需要严格隔离网络的生产环境部署。该方案具有可扩展性,可根据实际需求调整软件包和镜像列表。

mmx_2022的博客 654

Java 实体类字段注解参数的动态修改

注:麻烦大家关注我的公众号,会每日更新,面试题笔试题都会更新,麻烦大家多多关注。

新生代码农的博客 1602

自动驾驶入门到进阶完整指南:感知、预测、规划、端到端、仿真测评与场景挖掘全解析

对小白来说,不建议一开始直接冲端到端大模型。先学数据和坐标系:否则所有结果都看不懂。再学 LiDAR 3D 检测:最容易建立空间感。再学 BEV/多相机感知:这是当前主流。再学轨迹预测:理解交互和多模态。再学规划控制:理解车为什么这样开。再学仿真和闭环评测:理解 open-loop 和 closed-loop 差异。最后学端到端/VLM/VLA:这时候你才知道它到底替代了哪些模块。贯穿始终学习场景挖掘和安全测评:这是工业界最核心的能力之一。

u013250861的博客 398

Java属性中指定Json的属性名称(序列化和反序列化)

序列化对象,只需要使用注解"@JsonProperty(value = "pwd")" import com.fasterxml.jackson.annotation.JsonProperty; public class User{ @JsonProperty(value = "pwd") private String password; } ...

weixin_30577801的博客 1255

PS2硬盘启动终极指南:从FMCB到OPL,告别光驱打造游戏博物馆

在计算机存储与数据读取领域,硬盘启动技术通过将操作系统或应用程序从本地硬盘直接加载,绕过了传统光驱等外部介质,实现了速度与可靠性的双重提升。其核心原理在于利用引导程序接管系统初始化流程,直接访问硬盘上的特定分区与文件镜像。这项技术的价值在于极大提升了数据读取效率、降低了物理介质损耗,并扩展了存储容量与管理的灵活性。在怀旧游戏硬件改造、嵌入式系统定制等场景中,硬盘启动技术被广泛应用,以实现老旧设备的功能焕新与性能优化。本文聚焦于索尼PS2游戏主机的硬盘启动方案,深入探讨了如何利用FMCB(Free MCBoo

weixin_34295316的博客 1779

Vector CANape的使用记录

开门见山,今天想和大家分享下CANape使用记录,分享原因是近日在分析一个客户现场软件问题时,需要用到CANape来实时的监测ECU中的变量,因为之前对CANape的认知比较浅薄,觉得标定工程师使用他就足够了,但是这次的经历让我觉得需要写点东西来记录自己学习并使用他的过程。 相信大家能够在网上找到很多关于如何使用CANape的文章,从新建Project到后面的数据的观测、保存以及回放等等。我个人也是这么学过来的,所以我不打算从那些方面着手去描述如何使用她,而是根据我的真实使用过程以及问题的抛出到如何解决来

2万+

java小技巧~修改对象的属性名

今天联调的时候,有个功能是在初始化的时候将图片路径回显到vant组件的上传组件上,但是vant组件需要图片路径名叫url,而后端返给我的路径名叫filePath,而且是双层嵌套。一个个遍历老麻烦了,下面这个方法可以提高效率: 思想: 将对象数组转成字符串:JSON.stringify(); 使用replaceAll全部替换, 将字符串传成对象 let str = JSON.stringify(this.uploaderList); let str1 = str.replaceAll('filePa

qq_31539817的博客 2342

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1096

java反射通过属性名获取属性类型

Java反射通过属性名获取属性类型 在Java编程中,反射是一种强大的机制,可以在运行时动态地获取类的信息、属性和方法。反射给开发人员提供了访问和操作类的能力,使得代码更加灵活和可扩展。本文将重点介绍如何使用Java反射机制通过属性名获取属性类型。 反射简介 反射是Java语言的一种特性,它允许程序在运行时检查和操作类、方...

weixin_40776952的博客 233

Challenge 5 - OSCP B

jdwp可以执行命令,但是这个脚本需要python2来运行,靶机上没有,那么我们只能将8000端口代理出来了,我这里代理到我本地的7800端口上。访问8080端口显 hostname,我们通过nmap可以看到hostname为ms01.oscp.exam,修改/etc/hosts。试了下impacket-smbexec没有成功, 不过他开放了22端口,我们可以ssh登录web_svc用户。得到下面的结果,root用户运行了一个貌似是debug的进程。nmap扫描发现了一个可以的端口8021。

羽的博客 4946

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

如何在Java中获取实体类的属性名和属性值?

简单来说,实体类是用来表示数据模型的类,通常包含多个属性和对应的getter和setter方法。获取这些实体类的属性名和属性值是一个常见需求,尤其是在反射、序列化和框架开发中。值得一提的是,Java 8引入的Lambda表达式和Stream API也可以用来简化一些操作,但在获取实体类属性方面,反射依然是最直接的方法。如果你在工作中需要经常处理实体类,可以考虑封装一个工具类,专门用于获取属性名和属性值,这样可以提高代码的重用性。方法会得到当前字段在对象中的值,然后我们将属性名和属性值打印出来。

程序员总部的博客 1042

C#面试题及详细答案120道(01-10)-- 基础语法与数据类型

C#与.NET部分重点解析了7个核心问题:1)C#与.NET的依存关系;2)值类型与引用类型的内存差异;3)装箱拆箱的性能损耗;4)string/String与int/Int32的实质等价性;5)const与readonly的初始化区别;6)可空类型的应用场景;7)ref与out关键字的参数传递机制。内容包含原理对比、代码示例和优化建议,适合开发者系统掌握C#核心概念。(1

大剑师兰特的GIS世界 1965

java:实现动态属性实例(附带源码)

java:实现动态属性实例(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1773

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JavaScript对象简介

1. 对象的创建 对象字面量创建 var obj = { name : "terry", age : 12, gender: "男" } 构造函数创建对象 var obj = new Object();//创建一个根对象实例 obj.name = "terry"; obj.age = 12; obj.gender = "男"; 这里的属性添加和Java中有很大的区别: java中实例化对象之后,无法动态添加对象,而js却可以进行动态添加 class Peison(){ publ

qq_1241901326的博客 229

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

(Jackson 2.16新特性速览)多态序列化如何改变Java微服务?

掌握Java处理JSON的Jackson 2.16新特性(多态序列化),解决微服务中复杂类型的序列化难题。适用于Spring Boot分布式系统,通过@JsonSubTypes简化配置,提升性能与可维护性,值得收藏。

LiteProceed的博客 785

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

渗透测试入门必读:关于Java后端中的反序列化以及框架漏洞的那些事儿

Java安全漏洞与关键技术解析 摘要:本文梳理了Java相关核心概念与常见安全漏洞。关键技术包括:JNDI(命名目录服务接口)、RMI(远程方法调用)、反序列化机制、反射等。重点分析了反序列化漏洞成因,即通过重写readObject()方法嵌入恶意代码。典型案例包括FastJSON漏洞(利用AutoType功能)和WebLogic漏洞(XMLDecoder反序列化、T3协议漏洞等)。WebLogic还涉及SSRF漏洞,可通过换行符构造特殊请求。文章还介绍了Java Web三大组件(Servlet、Filte

Andytoe的博客 986

java-四十七天---读取jdbc.properties配置文件、maven、软件设计的一般原则、动态代理Proxy

1 全路径读取jdbc.properties配置文件 2 不全路径读取文件 3 把类中的资源文件作为流 4 分模块开发 5 pom.xml文件的一些依赖设置 6 软件设计的一般原则 7 由ClassBean设置类A,类B的全限定类名,经过反射获取类A,类B 8 创建A,B对象,并且...

weixin_41847891的博客 341

Java反射机制深度解析:从Class对象到动态编程实战

在Java编程中,动态编程能力是构建灵活、可扩展系统的关键技术之一。其核心原理在于允许程序在运行时检视和操作自身的结构,打破了编译期的静态限制。这项技术的核心价值在于实现运行时的动态行为,极大地提升了代码的灵活性和框架的通用性。它广泛应用于框架开发、测试工具、序列化/反序列化以及动态代理等场景。通过反射,开发者可以动态创建对象、调用方法、访问和修改字段,甚至处理注解和泛型信息。例如,在实现一个通用的数据导出工具时,结合**注解处理**和**动态方法调用**,可以自动根据模型生成报表,避免硬编码,显著提升开发

weixin_34178244的博客 508

如何解决RuoYi-AI项目中Tree结构序列化问题的终极指南

RuoYi-AI是基于ruoyi-plus实现的AI聊天和绘画功能后端项目,完全开源免费,后台管理界面使用elementUI,服务端采用Java17+SpringBoot3.X技术栈。在开发过程中,Tree结构序列化是一个常见的技术难点,本文将详细分析这一问题并提供完整的解决方案。 ## Tree结构序列化问题的常见表现 在RuoYi-AI项目中,Tree结构广泛应用于菜单管理、部门组织等功能

gitblog_07801的博客 368

Java反射机制:动态调用的利与弊

摘要:Java反射机制通过运行时动态获取类信息实现灵活调用,在框架开发、动态代理等场景中不可或缺。其核心优势包括动态性(如Spring依赖注入)、通用性(如JSON序列化)和扩展性(插件化架构)。但反射也存在性能损耗(调用速度慢10-100倍)、安全风险(可绕过访问控制)和可维护性问题(编译期不可检查)。优化策略包括缓存反射对象、限制使用场景和结合注解提升可读性。合理权衡反射的灵活性与潜在风险,才能在具体场景中最大化其价值。

925

用Jackson将Java对象转换成 JSON字符串

今天碰到一个javad问题,无论如何未能解决:

click726的专栏 1313
上一篇: Java并发编程 | 局部变量为什么是线程安全的
下一篇: Java 统计新客户
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值