最近在写项目的时候用到了FastJSON,遇到了一些问题。
比如这个问题
com.alibaba.fastjson.JSONException: autoType is not support. com.sun.domain.LoginUser
at ......
我查了网上的资料,大多是让我去添加全局设置
static {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
说实话,我已经添加了,还是会报错。
还有说要我检查domain是否有默认的构造方法,但是我用了Lombok,这个错误也直接排查。
在 FastJsonRedisSerializer 类里的全局配置区域,配置autotype白名单。
static {
ParserConfig.getGlobalInstance().addAccept("com.sun");
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
在测试可用后,我就缩小了包的范围,改成了:
static {
// 根据需求 自行更改
ParserConfig.getGlobalInstance().addAccept("com.sun.domain");
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
这个时候我就有个疑问,我都配置了全局,怎么还要额外配置白名单,那我配置全局的意义是什么?
然后我就去问AI为什么,AI给我了这个答案:
在
fastjson中,即使你全局启用了autoType支持(ParserConfig.getGlobalInstance().setAutoTypeSupport(true)),出于安全考虑,通常还需要配置一个白名单来限制哪些类型可以被自动识别和实例化。这是为了防止潜在的恶意代码利用自动类型识别功能执行未授权的操作。
当你调用
ParserConfig.getGlobalInstance().addAccept("com.sun")时,你实际上是在告诉fastjson:“除了默认的安全类型之外,我还信任com.sun包下的所有类型,你可以在没有明确指定类型的情况下反序列化它们。”
即使你已经全局启用了
autoType,如果不配置白名单,fastjson仍然会拒绝反序列化不在白名单中的类型,并抛出JSONException。这是为了增加一层额外的安全保护,确保只有被明确信任的类型才能被自动识别和反序列化。
因此,即使你已经全局启用了
autoType,为了确保安全性和正确性,你仍然需要配置白名单来指定哪些类型是被信任的。在这种情况下,将com.sun包添加到白名单中是必要的,以确保com.sun.domain.LoginUser类型可以被正确反序列化。
懂了。