• fastjson序列化和反序列化报com.alibaba.fastjson.JSONException: autoType is not support异常问题,解决方案整合


    1、问题起因

      2017年3月15日,fastjson官方发布安全升级公告,该公告介绍fastjson在1.2.24及之前的版本存在代码执行漏洞,当恶意攻击者提交一个精心构造的序列化数据到服务端时,由于fastjson在反序列化时存在漏洞,可导致远程任意代码执行。 自1.2.25及之后的版本,禁用了部分autotype的功能,也就是”@type”这种指定类型的功能会被限制在一定范围内使用。而由于反序列化对象时,需要检查是否开启了autotype。所以如果反序列化检查时,autotype没有开启,就会报错。

    2、问题产生的场景

      当调用 JSON.toJSONString(object, SerializerFeature.WriteClassName)后,得到的序列化字符串中,包含类的信息,即会含有一个“@Type”的键值对,描述类的信息。

      例如:"{"@type":"com.zhi.fund.domain.Student","age":18,"birthday":-1594800000000,"name":"xe6xb1x89xe5x8dxbf","status":true,"stuId":2}"

    3、解决方式:

      参考:https://github.com/alibaba/fastjson/wiki/enable_autotype

    4、FastJson的SerializerFeature属性整理

      参考:https://blog.csdn.net/u010246789/article/details/52539576

    名称 含义
    QuoteFieldNames 输出key时是否使用双引号,默认为true
    UseSingleQuotes 使用单引号而不是双引号,默认为false
    WriteMapNullValue 是否输出值为null的字段,默认为false
    WriteEnumUsingToString Enum输出name()或者original,默认为false
    UseISO8601DateFormat Date使用ISO8601格式输出,默认为false
    WriteNullListAsEmpty List字段如果为null,输出为[],而非null
    WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
    WriteNullNumberAsZero 数值字段如果为null,输出为0,而非null
    WriteNullBooleanAsFalse Boolean字段如果为null,输出为false,而非null
    SkipTransientField 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
    SortField 按字段名称排序后输出。默认为false
    WriteTabAsSpecial 把 做转义输出,默认为false
    PrettyFormat 结果是否格式化,默认为false
    WriteClassName 序列化时写入类型信息,默认为false。反序列化是需用到
    DisableCircularReferenceDetect   消除对同一对象循环引用的问题,默认为false
    WriteSlashAsSpecial 对斜杠’/’进行转义
    BrowserCompatible 将中文都会序列化为uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
    WriteDateUseDateFormat 全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
    DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
    NotWriteRootClassName 含义
    BeanToArray 将对象转为array输出
    WriteNonStringKeyAsString 含义
    NotWriteDefaultValue 含义
    BrowserSecure 含义
    IgnoreNonFieldGetter 含义
    WriteEnumUsingName

    含义

  • 相关阅读:
    [mybatis] expression: in.showLayers==true [org.apache.ibatis.ognl.ParseException: Encountered “ “in“
    IDEA pom中引用本地lib下的jar包
    IDEA Error:java xxxx 程序包不存在
    Spring注解 @NotBlank,@NotNull,@NotEmpty三者之间的区别
    [Vue warn]: Invalid prop: type check failed for prop “disabled“. Expected Boolean, got String
    centos7设置nginx开机自启
    centos7 源码安装redis设置开机自启
    MybatisPlus java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
    /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
    No Identifier specified for entity的解决办法《转载》
  • 原文地址:https://www.cnblogs.com/lpob/p/11853592.html
Copyright © 2020-2023  润新知