admin管理员组

文章数量:1534214

官网:http://x-stream.github.io/javadoc/com/thoughtworks/xstream/XStream.html

升级xstream jar包,maven配置:

<dependency>
 <groupId>com.thoughtworks.xstream</groupId>
 <artifactId>xstream</artifactId>
 <version>1.4.18</version>
</dependency>

升级完之后,发现反序列化异常,异常信息:

com.thoughtworks.xstream.converters.ConversionException:
case-exception:com.thoughtworks.xstream.security.ForbiddenClassException

先了解1.4.18都做了什么改动

在 1.4.18 版本之前,XStream 保留了一个默认的黑名单,以拒绝用于各种安全攻击的所有类型的 Java 运行时,以保证现有用户的最佳运行时兼容性。然而,这种方法已经失败。过去几个月已经表明,仅 Java 运行时就包含数十种可用于攻击的类型,甚至没有查看类路径上的第 3 方库。因此,新版本的 XStream 现在默认使用白名单,这也是目前优先推荐的方式。它也一直在控制台上抱怨第一次运行时未初始化的安全框架。任何遵循建议并为自己的场景初始化安全框架的人都可以轻松更新到新版本,没有任何问题。其他所有人现在都必须进行适当的初始化,否则新版本在反序列化时肯定会失败

然后开始解决问题,经过一系列查询有几种解决方案,

问题是升级jar引起的,最简单粗暴的方法是放弃升级,用1.4.18以下的版本

有文档说是因为类加载不通,设置成相同的类加载器即可
xStream.setClassLoader(clazz.getClassLoader());

原来的序列化代码在更新为1.4.18后,由于没有引入白名单,导致代码报错。需要添加白名单即可。
Class<?>[] classes = new Class[] { classType};
xStream.allowTypes(classes);

// 添加一些基础的类型,如Array、NULL、primitive、ANY
xStream.addPermission(NoTypePermission.NONE);

xStream.addPermission(AnyTypePermission.ANY);

// 首先清除默认设置,然后进行自定义设置
// 添加一些基础的类型,如Array、NULL、primitive、ANY
xStream.addPermission(ArrayTypePermission.ARRAYS);
xStream.addPermission(NullPermission.NULL);
xStream.addPermission(PrimitiveTypePermission.PRIMITIVES);

本文标签: xstreamthoughtworksConversionExceptionconverters