string类型的xml报文解析为java实体类object

回馈广大同行网友系列~首先thanks for 网友们的无私分享,在抄完之后我献上我的解决整理~~~~~
公司用内网,纯手打的
xml报文demo

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
	<ITEM>
		<XXXX></XXXX>
		...
	</ITEM>
	<ITEM>
		<XXXX></XXXX>
		...
	</ITEM>
</ROOT>

首先写一个XmlUtil工具类

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
...

public class XmlUtil{
	
	public static <T> T convertXmlStrToObject(Class<?> clazz,String xmlStr){
		T xmlObject = null;
		try{
			JAXBContext context = JAXBContext.newInstance(clazz);
			Unmarshaller unmarshaller = context.createUnmarshaller();

			XMLInputFactory xif = XMLInputFactory.newFactory();
			xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,false);
			xif.setProperty(XMLInputFactory.SUPPORT_DTD,false);
			XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xmlStr));
			xmlObject = (T) unmarshaller.unmarshal(new StringReader(xmlStr));
		} catch (Exception e){
			log.error("将报文转换为object失败:{}",e.getMessage());
		}

		return xmlObject;
	}
}

对于XML外部实体注入(XXE)问题
摘要
使用配置的 XML 解析器无法预防和限制外部实体进行解析,这会使解析器暴露在 XML External Entities 攻击之下。
缺陷描述
XML External Entities 攻击可利用能够在处理时动态构建文档的 XML 功能。XML
实体可动态包含来自给定资源的数据。外部实体允许 XML 文档包含来自外部 URI
的数据。除非另行配置,否则外部实体会迫使 XML 解析器访问由 URI
指定的资源,例如位于本地计算机或远程系统上的某个文件。这一行为会将应用程序暴露给 XML External Entity (XXE)
攻击,从而用于拒绝本地系统的服务,获取对本地计算机上文件未经授权的访问权限,扫描远程计算机,并拒绝远程系统的服务。
修复建议:
• 避免在可能的情况下直接处理用户输入。
• 如果需要从用户接收XML,则确保XML解析器受到限制和约束。
特别是禁用DTD解析和实体解析。在服务器上应用严格的xml架构,然后对输入的xml进行相应的验证
• 使用安全的XML解析器,并禁用DTD解析和实体解析。
• 不启用DTD解析或实体解析

你需要转化的类

@Data
@XmlRootElement(name = "ROOT")
public class XXXRoot{
	private List<XXX> ITEM;
}

ITEM对应了 < ITEM > 标签,如果要起别名可以试试@XmlElement(name = “ITEM”)我没试过,具体效果自己看吧

@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class XXX implements Serializable{
	@XmlElement(name="yyy")
	private String yy;

	.....
}

使用的时候,XXXRoot ddd = XmlUtil.convertXmlStrToObject(XXXRoot.class,xmlbaowenstring);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值