升级Spring Boot 2.0遇XStream安全框架未初始化问题求助
解决XStream Security framework未初始化的问题
这个错误是因为XStream 1.4.7及以后版本默认强制要求初始化安全框架,目的是防范反序列化漏洞。如果没有配置安全权限,XStream就会抛出这个提示,说明当前处于不安全状态。
针对你使用XStreamMarshaller的场景,解决方案是在创建Marshaller Bean时,手动获取XStream实例并配置安全白名单。下面是修改后的完整代码示例:
import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.security.NoTypePermission; import org.springframework.oxm.xstream.XStreamMarshaller; import org.springframework.context.annotation.Bean; import java.util.HashMap; import java.util.Map; @Bean public XStreamMarshaller sparkyMarshaller() { Map<String, Class<?>> myMap = new HashMap<>(); myMap.put("Sparky", Sparky.class); XStreamMarshaller xstreamMarshaller = new XStreamMarshaller(); xstreamMarshaller.setAliases(myMap); xstreamMarshaller.setSupportedClasses(Sparky.class); // 获取XStream实例并配置安全框架 XStream xstream = xstreamMarshaller.getXStream(); // 先禁用所有未明确允许的类型(最安全的做法) xstream.addPermission(NoTypePermission.NONE); // 允许Sparky类进行序列化/反序列化 xstream.allowTypes(new Class[]{Sparky.class}); // 如果你的业务中还用到了其他类(比如集合、自定义的其他实体),需要一并添加到白名单 // 示例:允许java.util包下的所有类(如果用到的话) // xstream.allowTypesByWildcard(new String[]{"java.util.**"}); return xstreamMarshaller; }
关键说明:
NoTypePermission.NONE:这一步是禁用所有类型的反序列化,确保只有你明确添加的类才能被处理,最大化安全性。allowTypes:精确指定允许的类,这里添加了你的Sparky类,如果后续有其他需要序列化的类,都要在这里补充。allowTypesByWildcard:如果需要允许某个包下的所有类,可以用这个方法,比如java.util.**,但建议尽量精确指定类,避免扩大权限范围。
如果后续运行中遇到类似Caused by: com.thoughtworks.xstream.security.ForbiddenClassException的错误,只需要把报错的类也添加到allowTypes或者allowTypesByWildcard的列表中即可。
内容的提问来源于stack exchange,提问作者LetsBeFrank
相关产品推荐
相关产品推荐

