首页 > 其他分享 >fastjson2 打开 AutoType

fastjson2 打开 AutoType

时间:2023-09-01 15:23:40浏览次数:39  
标签:fastjson2 JSONWriter classLoader Feature 打开 com 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

标签:fastjson2,JSONWriter,classLoader,Feature,打开,com,AutoType
From: https://www.cnblogs.com/viogs/p/17671978.html

相关文章

  • 一打开终端就默认进入conda的base环境,取消方法
    conda版本:4.10.3安装conda之后,在使用VSCode的时候,每次在里面使用powershell终端都是默认进入base环境,稍不注意就会用错python解释器,所以考虑取消这一设置。经过查看官方文档和自己尝试,有两种方法。法一:在终端修改配置conda官方文档中有condaconfig的相关使用介绍,其中有condac......
  • 禁止浏览器打开开发者工具
    <scripttype="text/javascript">//禁止鼠标右击document.oncontextmenu=function(){returnfalse;};//禁用开发者工具F12document.onkeydown=document.onkeyup=document.onkeypress=function(event){lete=eve......
  • 乌班图20.04版本下idea打开项目报错闪退(记录)ideaIU-2023.2.1.tar.gz
    [553960]WARN-#c.i.i.c.t.p.v.p.StateDatabaseParser-Nosuitabledriverfoundforjdbc:sqlite:/root/.config/Code/User/globalStorage/state.vscdbjava.sql.SQLException:Nosuitabledriverfoundforjdbc:sqlite:/root/.config/Code/User/globalStorage/stat......
  • google chrome浏览器启动时打开hao123怎么办?
    googlechrome浏览器一启动就跳转到hao123,看着就让人很不舒服!!!-----------------------------------------------------------------------------------------------------------搜了几种解决办法没能根治,特此安排我亲测可用的解决方法(注意最后一步):点击快捷方式按钮图标,右键-属......
  • 在线教育系统源码Web版丨知识付费教培授课网校平台开发丨兔知云课堂点燃学习的星途,打
    今天,我们带您一起走进一款教育小程序,这是一个承载着无限学习可能的平台。随着科技的不断进步,教育正焕发出崭新的活力,而这个小程序,正是将教育引向更广阔的未来。 进入小程序,世界在您指尖间展开。您可以轻触屏幕,搜索您所需的资料,或者输入关键词,即刻迎来丰富多彩的学习资源。试卷......
  • 知识付费系统源码基于PHP开源的网站内容付费源码,打开行业新机遇
    为什么说无论哪个行业,都值得考虑运用知识付费?让我重新为你解释这个逻辑,一旦你理解了它,你就将拥有极大地放大你现有生意机会的能力。 我们通常将知识付费课程视为一种产品,但它实际上还有另一种本质,那就是广告。或许你并未意识到,在创建知识付费课程时,你也在打造一种媒介,一种可以......
  • CEF4Delphi(DELPHI Google Chrome 浏览器封装) 折腾 (2)--打开一个网页
      打开网页的,折腾了好久,试运行DEMO,就行,把DELPHI的代码抄过来,就是不行,然后把自己弄的控件名称搞的与DEMO一样,属性全对一样了,还是不行,郁闷很久后,才发现工程文件里面还要加代码。 我的工程名为:OpenChrome 选中工程文件后按CTRL+V,然后做以下修改:下面红色的代码是CEF4中需要......
  • 直接从命令行启动xilinx/SDK并打开工程
    编写一个启动脚本s19sdk.sh,内容如下:#!/bin/bashsource/opt/Xilinx/SDK/2019.1/settings64.shxsdk-workspace~/work/myproject/myproject.sdk&然后增加执行权限后运行,chmoda+xs19sdk.sh./s10sdk.sh参考:https://www.coder.work/article/7965726......
  • android studio启动时关闭上次打开的项目
    每次androidstudio启动就会自动打开上次关闭的项目然后电脑有时候会很卡解决办法:......
  • python 在windows下open打开文件默认编码
    open(self.data_path):python在用open打开文件时,如果默认不指定编码encoding="UTF-8"则会用windows默认的编码,一般为GBK,有的开源代码并未指定编码,但是UTF8的文件,全局修改一下,设置windows环境变量:PYTHONUTF8=1,参考:https://dev.to/methane/python-use-utf-8-mode-on-windows-212i......