簡體   English   中英

使用JAXB獲取XML簽名的最佳方法

[英]Best way to get XML signature using JAXB

我正在使用REST和XML進行客戶端和服務器之間的通信。 客戶端為每個xml添加一個封裝簽名,服務器需要驗證其身份驗證。 我正在使用JAXB進行編組和解組。 我需要將簽名元素作為org.w3c.dom.Element來驗證它,我想避免使用直接的DOM操作。 服務器還需要對響應XML進行簽名。

我們來看一些代碼:

REST界面

getXML(Root root)

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。 我這樣做的是春季批量工作。

我有以下豆類:

@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元素產品正被映射到類實例。

BTW sax / stax似乎比標准的Unmarshaller更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM