2017-04-05 69 views
0

我必须通过使用WSO2 ESB实现一个场景,作为响应客户端时流式加密二进制有效载荷(我假设案例中的内容类型是Application/Octet-流),下面是我的想法的一些细节:如何通过WSO2流式加密有效载荷文件ESB

  1. 端点像“http://myhost/backend/”它提供业务功能;
  2. 通过端点传递消息的代理;
  3. 我试图编写一个OutSequence来检查Content-type:如果Content-Type匹配Application/Octet-Stream,则调用我的自定义类中介以流式加密fileStream并响应。

我不知道如何编写类中介以使其实现?我怎么能从消息中读取/读取文件流,以及如何将outputStream放回到响应中,而我只能在调解方法中看到mc.getEnvelope().getBody()?下面是我目前的调解员,这不起作用。

public boolean mediate(MessageContext mc) { 
    org.apache.axis2.context.MessageContext amc = ((Axis2MessageContext) mc).getAxis2MessageContext(); 
     try { 
      String contentID = amc.getAttachmentMap().getAllContentIDs()[0]; 
      DataHandler dh = amc.getAttachment(contentID); 
      dh.getDataSource().getName(); 
      InputStream is = null; 
      try { 
       is = dh.getInputStream(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
       String line = null; 
       while ((line = br.readLine()) != null) { 
        System.out.println("client read:" + line); 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return true; 
} 

非常感谢任何有经验的人都会好心帮忙。

+0

你的问题很unspecificand最有可能不是在SO回答,请提供一些代码,使你有试过没... – Andreas

+0

谢谢@Andreas!在解决问题时,我会继续粘贴我的代码。 –

回答

0

粘贴我当前的解决方案,面对类似问题的任何其他人。 在调解器中,我通过OMText.InputStream从响应流中读取文件内容,并使用net.lingala.zip4j包以加密的原始文件编写zip文件(在内存中);最后,我将压缩文件内容作为ByteArray写回肥皂消息的OMElement。

public boolean mediate(MessageContext mc) { 
    System.out.println("========================Mediator log start================================"); 
    org.apache.axis2.context.MessageContext amc = ((Axis2MessageContext) mc).getAxis2MessageContext(); 
    try { 
     @SuppressWarnings("unchecked") 
     Map<String, String> responseHeaders = (Map<String, String>) amc.getProperty("TRANSPORT_HEADERS"); 
     String rawFileName = ""; 
     String[] contentDisps = responseHeaders.get("Content-Disposition").split(";"); 
     for (String item : contentDisps) { 
      System.out.println("item::" + item); 
      if (item.trim().startsWith(CONTENT_DISPOSITION_FILENAME)) { 
       rawFileName = item.substring(item.indexOf("\"") + 1, item.length() - 1); 
       break; 
      } 
     } 
     responseHeaders.put(
      "Content-Disposition", 
      responseHeaders.get("Content-Disposition").replace(rawFileName, 
       rawFileName.substring(0, rawFileName.lastIndexOf(".")) + ".myzip")); 
     OMElement binaryPayload = 
      amc.getEnvelope().getBody() 
       .getFirstChildWithName(new QName("http://ws.apache.org/commons/ns/payload", "binary")); 
     OMText binaryNode = (OMText) binaryPayload.getFirstOMChild(); 
     DataHandler dataHandler = (DataHandler) binaryNode.getDataHandler(); 
     InputStream is = dataHandler.getInputStream(); 
     ByteArrayOutputStream responseOutputStream = new ByteArrayOutputStream(); 
     ZipOutputStream zipOutputStream = getZipOutputStreamInstance(responseOutputStream, rawFileName); 
     // write to zipOutputStream 
     byte data[] = new byte[BUFFER_SIZE]; 
     int count; 
     while ((count = is.read(data, 0, BUFFER_SIZE)) != -1) { 
      zipOutputStream.write(data, 0, count); 
      zipOutputStream.flush(); 
     } 
     zipOutputStream.closeEntry(); 
     zipOutputStream.finish(); 
     InputStream in = new ByteArrayInputStream(responseOutputStream.toByteArray()); 
     DataHandler zipDataHandler = new DataHandler(new StreamingOnRequestDataSource(in)); 
     OMFactory factory = OMAbstractFactory.getOMFactory(); 
     OMText zipData = factory.createOMText(zipDataHandler, true); 
     zipData.setBinary(true); 
     binaryPayload.getFirstOMChild().detach(); 
     binaryPayload.addChild(zipData); 
     amc.setProperty("TRANSPORT_HEADERS", responseHeaders); 
     System.out.println("========================Mediator end=================================="); 
    } catch (Exception ex) { 
     System.out.println("exception found here:"); 
     ex.printStackTrace(); 
    } 
    return true; 
} 
+0

我不确定它是否可以在某处进行优化,我将zip文件字节写回消息。现在看来,InputStream对象从OutputStream中一次读取所有字节。感谢有人能对此发表评论。 –