排除对象属性序列化的三种方式

说明:在项目里,经常可以看到以下日志内容,将对象序列化后直接打印出来,观察对象数据,判断当前处理逻辑正确与否。

(以下信息来自:https://www.tl.beer/randbankcard.html生成器,信息均为虚构)

在这里插入图片描述

一般来说,数据库服务器和应用服务器(项目)不会是一台服务器,不会放在一起,但项目产生的日志一定是和项目放在一起的,通常就是在项目目录里。所以,日志文件如果被泄露,用户的数据(证件号、手机号、真实姓名)也就被泄露了,这样做有风险。以下介绍几种方式,来排除日志中的敏感属性值。

方式一:重写toString()

最简单的方式,重写对象的toString()方法,只打印非敏感属性值,如下:

import lombok.*;
import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class User implements Serializable {

    /**
     * id
     */
    private String id;

    /**
     * 证件号
     */
    private String cardNo;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 姓名
     */
    private String name;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                '}';
    }
}

同样,在调用打印日志信息时,就不能用序列化的方式了,需要改成toString(),或直接输入变量名

log.info("user: {}", user);// 或 user.toString()

但是,如果你对象的toString()方法另有他用,或者系统中打印日志已经都是序列化的方式了(如 JSON.toJson()),一个个去改太麻烦,这种方式就不适合了,推荐下面两种方式。

方式二:transient关键字

可以使用Java关键字,transient,修饰属性,表示改属性不能被序列化,如下:

import lombok.*;
import java.io.Serializable;

@Data
public class User implements Serializable {

    /**
     * id
     */
    private String id;

    /**
     * 证件号
     */
    private transient String cardNo;

    /**
     * 手机号
     */
    private transient String phone;

    /**
     * 姓名
     */
    private transient String name;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private transient String password;
}

敏感字段未被序列化

在这里插入图片描述

方式三:@JsonIgnore注解

使用JSON自带的注解,@JsonIgnore,这个注解的作用同样是序列化的时候排除该属性,也能达到相同的目的;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;
import java.io.Serializable;

@Data
public class User implements Serializable {

    /**
     * id
     */
    private String id;

    /**
     * 证件号
     */
    @JsonIgnore
    private String cardNo;

    /**
     * 手机号
     */
    @JsonIgnore
    private String phone;

    /**
     * 姓名
     */
    @JsonIgnore
    private String name;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    @JsonIgnore
    private String password;
}

总结

除了以上三种方式外,或许还有其他方法,比如加密输出,让显示在日志中的是密文,对于开发人员排查问题来说,这些敏感数据是无关紧要的,明文密文都差不多,如果想知道明文内容,可以在程序里写个main()方法转为明文,只麻烦了一点点。

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

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

相关文章

优秀的 Java 项目,代码都是如何分层的?

在Java中,常见的分层结构通常是基于MVC(Model-View-Controller)或者MVP(Model-View-Presenter)等设计模式。 1. 模型(Model)层 模型层主要负责处理数据的逻辑和操作,通常包括以下内…

大学c语言基础很差,能不能学51单片机?会不会很困难?

开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的, 我师父给了一些51单片机学习方法和资料,让我不断提升自己,感谢帮助过我的人, 如大家和我一样…

小米/红米手机刷机错误:Missmatching image and device

报错: Missmatching image and device。 场景: 该解决方法只适用于手机是通过EMT解锁的。 解决方法: 打开刷机脚本,并注释检测脚本: 刷机脚本根据不同的刷机方式,选择编辑不同的脚本,例如&am…

地图在数字孪生中的7个价值,领导也得点头认可。

地图在数字孪生大屏中扮演着重要的角色,具有以下几个作用: 空间可视化 地图可以将数据在空间上进行可视化展示,将各种信息和指标与地理位置相结合。通过地图的展示,用户可以直观地了解数据在不同地区的分布情况,帮助…

Stable Diffusion拓展Deforum AI视频生成

X轴平移值Z轴位移3D翻转 透视翻转

使用System.Drawing进行几何图形绘制

1.概要 使用System.Drawing进行几何图形绘制 System.Drawing 是.NET框架中的一个命名空间,提供了基本的绘图功能,包括绘制几何图形(如矩形、椭圆、线条等)。它通常用于Windows Forms应用程序中的绘图。你可以使用 Graphics 类来…

企业级WEB服务Nginx安装

企业级WEB服务Nginx安装 1. Nginx版本和安装方式 Mainline version 主要开发版本,一般为奇数版本号,比如1.19Stable version 当前最新稳定版,一般为偶数版本,如:1.20Legacy versions 旧的稳定版,一般为偶数版本,如:1.18Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安…

我是如何免费抵御一个多月的 DDos/CC 攻击的?

今天明月给大家详细分享一下我的博客是如何免费抵御了长达一个多月的 DDos/CC 攻击的,在【现在 DDos/CC 攻击门槛低的可怕!】一文里明月就说过现在 DDos/CC 攻击几乎是没有门槛的,任何一个老鼠屎在群里看到你的博客都可以轻松便捷的发动一次 …

智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码)

智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码) 文章目录 智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码)文章概述源码设计文章概述 智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码) 源码设计 %% clear all clc N=25; % Number of s…

瞬息全宇宙——穿越之旅终极教程,手把手教你做出百万点赞视频

最近一种叫“瞬息全宇宙”的视频火了,抖音一期视频百万赞,各个博主视频都在带瞬息全宇宙这个标签,于是就有很多朋友催我出教程了,在琢磨了几天之后,终于整出来了 教程包含了插件的安装,界面的讲解&#xff…

为什么说气膜是环保建筑呢—轻空间

气膜建筑,作为一种绿色环保建筑,其环保特性主要体现在以下几个方面: 1. 节约水资源: 气膜建筑在施工和运行过程中不需要大量水资源,与传统建筑相比,可以每年节约数万吨水资源。这种节约不仅有利于缓解水资源…

paddle ocr v4 2.6.1实战笔记

目录 效果图: 安装 模型权重是自动下载,如果提前下载会报错。 识别orc,并opencv可视化结果,支持中文可视化 官方原版预测可视化: 效果图: 安装 安装2.5.2识别结果为空 pip install paddlepaddle-gpu…

美国空军高调展示首个AI战斗机!部长亲自试驾全程未干预,10万行代码试飞21次

【新智元导读】美军战斗机,能由AI完成自主空战了!最近,美国空军部长Kendall亲自试驾了国防部正在研制的X-62A AI飞机。1小时的飞行过程中,Kendall全程未干预,所有动作都由AI自主完成。 最近,军事圈被这个消…

长途火车~48小时记录

1.出门记得带大功率充电宝,最好是50000ma及以上的,不然还没上火车,手机就没电了,电量焦虑症又来了。手机有电就有无限可能。

PSFR-GAN复现

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言快速开始安装依赖权重下载及复原 训练网络数据集训练脚本 代码详解训练BaseOptio…

JavaScript APIs

控制网页元素交互等各种网页交互效果。 一、Web API基本认知 声明数组和变量优先使用const 使用let声明变量的情况: 1、如果基本数据类型的值或者引用类型的地址发生变化的时候,需要用let 2、比如 一个变量进行加减运算,比如 for循环中的…

如何通过香港站群服务器高效实现网站内容的快速更新?

如何通过香港站群服务器高效实现网站内容的快速更新? 在当今激烈的数字市场竞争中,网站内容的快速更新对于吸引用户和保持竞争优势至关重要。而利用香港站群服务器实现这一目标,则具备诸多优势。下面将详细探讨如何通过香港站群服务器高效实现网站内容…

codeblock couldn‘t create project directory :path

1.原因: 因为我使用的是mac虚拟机,所以路径跟window不太一样,可能导致codeblock找不到路径,所以无法创建。 2.换一个跟window文件路径相同的就好,例如 C:\programPractice\myProject\

微火全域运营指南:如何选择靠谱的全域运营平台

当前,全域运营成为了一条全新的创业赛道,不少想要做全域运营服务商的创业者开始在各种渠道打听全域运营平台的相关消息,以此作为全域运营平台选择的依据。但其实,全域运营平台根本不用选择。 为什么这么说?首先&#x…

5分钟学设计模式:简单工厂与美食街的不期而遇

大家好,我是知微。 写代码好几年,是不是还纠结于这些问题: 面对一堆if-else,代码越写越长,维护起来比攀登珠穆朗玛峰还难每次只敢小心翼翼改个小功能,生怕程序突然“嘭”一声,全炸了想学习大佬…