我使用 REST 和 XML 进行客户端和服务器之间的通信。客户端向每个 xml 添加封装签名,服务器需要验证其身份验证。我使用 JAXB 进行编码和解码。 我需要获取 org.w3c.dom.Element 形式的签名元素来验证它,并且我想避免使用直接 DOM 操作。 服务器还需要对响应 XML 进行签名。
让我们看一些代码:
REST接口(interface)
getXML(根根)
XML:
<root>
<foo></foo>
<bar></bar>
<Signature Id="Signature-1c7757b0" xlns="http://www.w3.org/2000/09/xmldsig#">
...
</Signature>
<root>
这是我当前的解决方案。
JAXB 类
@XmlRootElement
public class Root{
@XmlElement
private Foo foo;
@XmlElement
private Bar bar;
@XmlAnyElement(lax = true)
private List<Element> signature;
}
有人能想出更好的解决方案来处理这个问题吗?我在网上没有找到很多专门详细说明如何使用 DSig 库和 JAXB 的帮助。
最佳答案
我不确定我是否理解正确,但如果您需要提取签名,可以使用 stax。我对 Spring 批量作业这样做。
我有以下 bean :
@Bean
public StaxEventItemReader<Catalog.Products.Product> nexwayCatalogReader() {
return Try.ofFailable(() -> {
final StaxEventItemReader<Catalog.Products.Product> itemReader = new StaxEventItemReader<>();
itemReader.setResource(new UrlResource(nexwaySettings.getEndpoints().getXmlCatalogUrl()));
itemReader.setFragmentRootElementName("product");
itemReader.setUnmarshaller(productMarshaller());
return itemReader;
}).orElseThrow(() -> new RuntimeException("Unable to create resource using nexwayCatalogUrl = ["
+ nexwaySettings.getEndpoints().getXmlCatalogUrl() + "]"));
}
@Bean
public Jaxb2Marshaller productMarshaller() {
final Jaxb2Marshaller productMarshaller = new Jaxb2Marshaller();
productMarshaller.setMappedClass(Catalog.Products.Product.class);
productMarshaller.setClassesToBeBound(Catalog.Products.Product.class);
return productMarshaller;
}
因此读者只读取我需要的 xml 部分(产品)。 Xml 元素产品正在映射到类实例。
顺便说一句,sax/stax 似乎比标准 Unmarshaller 更好。
关于java - 使用 JAXB 获取 XML 签名的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36626295/