使用Jackson替换FastJson的一个小BUG

①使用mapper去设置FAIL_ON_UNKNOWN_PROPERTIES为false,不转换不知道的字段

mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

②在要转换的Javabean上加上注解

@JsonIgnoreProperties(ignoreUnknown = true)

该注解还可以忽略指定字段,例如:

@JsonIgnoreProperties({ "internalId", "secretKey" })

忽略为null的字段的两种做法

注解
 @JsonInclude(Include.NON_NULL)

通过ObjectMapper设置

new ObjectMapper().setSerializationInclusion(Include.NON_NULL);

分割线下请忽略


在公司开发系统时使用了FastJson来转换对象和json字符串,版本为1.1.43,在一段时间后发现报错,上网一查发现阿里发布了最新公告:
公告引用如下:
安全公告20200601

近日,阿里云应急响应中心监测到fastjson爆发新的反序列化远程代码执行漏洞,黑客利用漏洞,可绕过autoType限制,直接远程执行任意命令攻击服务器,风险极大。

漏洞描述

fastjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过autoType限制,风险影响较大。阿里云应急响应中心提醒fastjson用户尽快采取安全措施阻止漏洞攻击。

影响版本

fastjson <=1.2.68
fastjson sec版本 <= sec9
android版本不受此漏洞影响

这时发现我们的版本正是受波及的版本,现在面临的有两个选择
①将现有fastjson版本改至不受影响的版本;
②寻找替代品并更换fastjson。

考虑到即使升级版本以后也可能受到影响,所以选择用支持更多自主配置化的JackSon,以下就是在替换过程中遇到的一个问题。

无论是使用JackSon还是FastJson,无非是用来转换JSON字符串为对象或者转换对象为JSON字符串,但是我们使用JSON转对象的时候往往JSON数据不是那么规范,存在以下几种情况:
①JSON中有的字段在JavaBean中没有该属性
②JSON中字段值有的为null,有的又是空字符串 “”

在这次替换过程中就遇到了JSON中有的字段在JavaBean中不存在
代码如下

    public static AppUser getBody(String token) {
        String accessToken = token;
        if(token.startsWith(PREFIX)) {
            accessToken= token.replace(PREFIX, "");
        }
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(accessToken)
                    .getBody();
            
            ObjectMapper mapper = new ObjectMapper();
            return mapper.readValue(mapper.writeValueAsString(claims), AppUser.class);
//            return JSON.parseObject(JSON.toJSONString(claims),AppUser.class);
        } catch (Exception e) {
            return null;
        }
    }

注释掉的代码为原来使用FastJson的代码,Claims是jwt包中的
有以下两种解决方式
①使用mapper去设置FAIL_ON_UNKNOWN_PROPERTIES为false,不转换不知道的字段

mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

②在要转换的Javabean上加上注解

@JsonIgnoreProperties(ignoreUnknown = true)

该注解还可以忽略指定字段,例如:

@JsonIgnoreProperties({ "internalId", "secretKey" })

忽略为null的字段的两种做法

注解
 @JsonInclude(Include.NON_NULL)
通过ObjectMapper设置
new ObjectMapper().setSerializationInclusion(Include.NON_NULL);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jacksonfastjson都是用于处理JSON数据的Java库。它们提供了序列化和反序列化JSON数据的功能。 在序列化方面,这两个库有一些差异。fastjson默认情况下不会序列化null值,也就是说如果一个属性的值是null,在序列化后,该属性将不会出现在JSON字符串中。而jackson则默认会序列化null值,即使属性的值为null,该属性也会在JSON字符串中呈现。 两个库在序列化时也有一些其他的功能配置。例如,fastjson可以通过设置fastjson的序列化过滤器进行定制化处理,还可以美化输出JSON字符串等。而jackson可以全局配置序列化的行为,比如将驼峰命名转换为下划线命名,忽略某些属性的序列化等。 在反序列化方面,fastjsonjackson都提供了相应的功能。它们可以将JSON字符串转化为Java对象。 总结来说,jacksonfastjson都是功能强大的Java库,用于处理JSON数据。它们在序列化和反序列化方面有一些差异,并且提供了不同的配置选项来满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [jacksonfastjson](https://blog.csdn.net/xuxuxux123/article/details/126625323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JacksonFastJson快速入门(整合SpringMVC)](https://blog.csdn.net/qq_45173404/article/details/108417438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值