fastjson2 打开 AutoType

这篇具有很好参考价值的文章主要介绍了fastjson2 打开 AutoType。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 功能简介

FASTJSON支持AutoType功能,这个功能在序列化的JSON字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。

2. AutoType安全机制介绍

  • 必须显式打开才能使用。和fastjson 1.x不一样,fastjson 1.x为了兼容有一个白名单,在fastjson 2中,没有任何白名单,也不包括任何Exception类的白名单,必须显式打开才能使用。这可以保证缺省配置下是安全的。
  • 支持配置safeMode,在safeMode打开后,显式传入AutoType参数也不起作用
  • 显式打开不推荐,打开后会有反序列化风险,打开AutoType不应该在暴露在公网的场景下使用。建议参照本文中的第5点代替AutoType功能。

3. fastjson2如何正确的打开autoType的功能

正常情况下,出于安全考虑,我们默认是关闭autoType的能力的,但是可以通过构建AutoTypeBeforeHandler白名单的方式来打开,废话不多说,上代码

package com.example.es.fastjson2;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.Filter;
import lombok.extern.slf4j.Slf4j;

/**
 * @author peng.hu1
 * @Date 2023/9/1 14:45
 */
@Slf4j
public class JSonSerializer {

    public JSONWriter.Feature[] features = new JSONWriter.Feature[]{
            JSONWriter.Feature.WriteClassName,
            JSONWriter.Feature.FieldBased,
            JSONWriter.Feature.ReferenceDetection,
            JSONWriter.Feature.NotWriteDefaultValue,
            JSONWriter.Feature.WriteNameAsSymbol,
            JSONWriter.Feature.WriteEnumsUsingName
    };

    private static final Filter autoTypeFilter;


    static {
        autoTypeFilter = JSONReader.autoTypeFilter(
                // 按需加上需要支持自动类型的类名前缀,范围越小越安全, 我这个就比较过分了,直接全部放开,哈哈
                "com.",
                "org.",
                "java."
        );
    }

    /**
     * 序列化
     * @param object 对象
     * @param classLoader
     * @return
     */
    public byte[] serialize(Object object, ClassLoader classLoader) {
        ClassLoader swap = Thread.currentThread().getContextClassLoader();
        try {
            if (classLoader != null) {
                Thread.currentThread().setContextClassLoader(classLoader);
            }
            return JSON.toJSONBytes(object, features);
        } catch (Throwable t) {
            log.error("SerializeException" ,t);
            throw new RuntimeException("serialize error", t);
        } finally {
            if (classLoader != null) {
                Thread.currentThread().setContextClassLoader(swap);
            }
        }
    }

    public <T> T deserialize(byte[] bytes, Class<T> type, ClassLoader classLoader) {
        ClassLoader swap = Thread.currentThread().getContextClassLoader();
        try {
            if (classLoader != null) {
                Thread.currentThread().setContextClassLoader(classLoader);
            }
            try {
                return JSON.parseObject(bytes, type, autoTypeFilter,
                        JSONReader.Feature.UseDefaultConstructorAsPossible,
                        JSONReader.Feature.UseNativeObject,
                        JSONReader.Feature.FieldBased
                );
            } catch (Exception e) {
                return JSON.parseObject(bytes, type);
            }

        } catch (Throwable t) {
            log.error("SerializeException" ,t);
            throw new RuntimeException("deserialize error", t);
        } finally {
            if (classLoader != null) {
                Thread.currentThread().setContextClassLoader(swap);
            }
        }
    }
}

这里面最核心的地方就在这里 JSONReader.autoTypeFilter(“*”), 这是个白名单过滤filter文章来源地址https://www.toymoban.com/news/detail-688969.html

到了这里,关于fastjson2 打开 AutoType的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决com.alibaba.fastjson.JSONException:autoType is not support问题,Redis FastJson

    最近在配置redis序列化问题的时候,使用fastjson来进行序列化,报异常: com.alibaba.fastjson.JSONException: autoType is not support. org.springframework.security.core.authority.SimpleGrantedAuthority com.alibaba.fastjson2.JSONException: autoType is not support. org.springframework.security.core.authority.SimpleGrantedAuthority 等等问题

    2024年02月07日
    浏览(36)
  • springboot-redis使用fastjson2

    注:springboot2.*使用fastjson2-extension-spring5,3.*使用fastjson2-extension-spring6

    2024年02月15日
    浏览(29)
  • fastjson2 转换别名 null变空字符串

    2024年02月02日
    浏览(28)
  • 【Java 笔记】使用Fastjson2时,对象转json首字母大小写问题

    开发环境: 一、JSON 转 Object 1.问题: 2.解决方案 二、Object转 JSON 三、SpringBoot设置fastjson2 为默认 pom.xml 2. 配置类 四、FastJson2 注解 默认 2. @JSONType 类注解 3. @JSONField(name = \\\"othername\\\") 属性注解 五、思考问题 Java 对象为什么需要序列化? 为什么对象没有实现Serializable接口,也可以

    2024年02月16日
    浏览(39)
  • (已解决)redis.get报错com.alibaba.fastjson.JSONException: autoType is not support

    redis存取值问题,存自定义实体对象; 第一次取的时候报错: com.alibaba.fastjson.JSONException: autoType is not support 。 GenericFastJsonRedisSerializer序列化和反序列化redis的value值,需要bean对象含有无参构造方法。 解决:         检查自定义实体对象是否有无参构造方法 ;添加有参构造后

    2024年02月12日
    浏览(36)
  • 【fastjson2.x 记录】那些从1.x升级到2.x踩过的坑

    这篇文章主要记录升级到 fastjson2.x 版本后出现的一些问题  问题描述:从 2.x 版本后,fastjson 貌似开始对代码模块进行了拆分,所以在调整配置的时候,会发现有些类突然没了,其实是需要引入其他的扩展包。 从 2.0.22 版本开始,需要引入下面三个 jar 包 起初的 2.x 版本,只

    2024年02月13日
    浏览(25)
  • 解决Fastjson2 oom(Out Of Memory),支持大对象(LargeObject 1G)json操作

    在使用Fastjson中的 JSON.toJSONString时,如果对象数据太大(64M)会出现Out Of Memory,查看源码发现为JSONWriter中的判断代码  其中maxArraySize默认最大为64M,如果超过了就会抛出oom错误  如果fastjson过多的使用内存,也可能导致java堆内存溢出,所以这里建议控制好json对象大小,避免过多过大

    2024年02月12日
    浏览(29)
  • 关于fastjson版本报错write javaBean error, fastjson version 1.2.62, fieldName : 8

    按f12查看请求包,status为500说明为服务端错误。 在编译器中查看,fastjson报错。 在servlet中只有序列化(java对象转json字符串)时用到了fastjson。 引入 :JavaBean 应该实现 Serializable 接口,以便其状态可以在网络上传输或持久化到磁盘。进一步证明,序列化出错。 write javaBean e

    2024年02月02日
    浏览(46)
  • 解决com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.83

    在日志中,Fastjson似乎试图将 StandardMultipartHttpServletRequest 序列化为JSON这可能是因为 HttpServletRequest 被错误地传递给了Fastjson,而不是 MultipartFile 查看代码           看到问题可能出现在尝试将MultipartFile转换为JSON时具体来说,Fastjson库在尝试序列化HttpServletRequest对象时可能

    2024年02月03日
    浏览(46)
  • FastJson使用和依赖

    FastJson是阿里巴巴提供的JSON框架,可以将Java对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为Java对象。 使用FastJson需要在项目中引入依赖。在Maven项目中,需要在pom.xml文件中添加以下依赖: 在Gradle项目中,需要在build.gradle文件中添加以下依赖: 通过添加FastJs

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包