




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、在某些場景中AXIS提供很強大的功能,包括添加消息頭,提供NTLM等多種認證方式,進行ACK發(fā)送的功能,具體參考SAP 的AXIS FQA。本文檔主要講述PI的AXIS部署以及自定handler,涉及2個handler,一個用于外圍系統(tǒng)異步發(fā)送系統(tǒng)的時候發(fā)生ACK給外圍系統(tǒng),另一個是PI采用Handler實現(xiàn)NTLM V2安全認證。PI7.31 SP15 ,PI7.4 SP10之后SAP推出了針對Apache HTTP Client library的補丁,參考note 2062567 - Integration of Apache HttpClient library in the PI Ax
2、is adapter可以實現(xiàn)NTLM V2。而對于這2個補丁之前的版本SAP不支持 NTLM V2協(xié)議。本例的方法是根據(jù)SAP的SP包中的相關類進行反編譯后的源代碼封裝成自己的handler類。首先PI要支持AXIS,則需要部署com.sap.aii.af.axisproviderlib.sda部署情況可以通過網址http:/<host>:<port>/XIAxisAdapter/MessageServlet進行校驗。用到下面的類:addressing-1.0.jaraxis-1.4.jarcommons-codec-1.9. jar(開始使用1.3版本,發(fā)現(xiàn)有bug:
3、 java.lang.RuntimeException: java.lang.NoSuchMethodError: mons.codec.binary.Base64.(I)V;)commons-discovery-0.2.jarcommons-httpclient-3.0.jarcommons-logging-1.0.4.jarcommons-net-1.0.0-dev.jarhttpclient-4.5.1.jar (NTLM V2 用到此包,下面的2個包也一樣)httpcore-4.4.4.jar log4j-1.2.91.jarSandesha-1.0.jarwsdl4j-1.5.1.j
4、arwss4j-1.5.7.jarxalan-2.7.1.jarxmlsec-1.4.2.jar用工具sdaMakerTool進行壓縮。如果是自己開發(fā)的handler類沒有用到其他PI標準類的話也可以獨立部署到這個包中,如果用到了其他類,其他的jar類也一并壓縮到這個包中,并要進行加載,另外一種方式是把自定的handler類在SAP 的axis sample adapter中實現(xiàn),參考AXIS的FQA.本文檔中的兩個類都是獨立的類,用到的SAP標準的jar文件也壓縮到其中。ACK handler類實現(xiàn),網上有這個blog,照著blog實現(xiàn)。代碼如下。package com.sap.aii.ax
5、is.sample.handlers;import java.io.ByteArrayInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.io.StringReader;import java.io.StringWriter;import java.nio.charset.Charset;import java.sql.Timestamp;import java.text.S
6、impleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Random;import java.util.TimeZone;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.soap.MessageFactory;import javax.xml.soap.MimeHeaders;import javax.xml.soap.SOAPElement;import javax.xml.soap.SOAPExcepti
7、on;import javax.xml.soap.SOAPMessage;import javax.xml.transform.OutputKeys;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.TransformerFactory
8、ConfigurationError;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import javax.xml.transform.stream.StreamSource;import org.apache.axis.AxisFault;import org.apache.axis.Message;import org.apache.axis.MessageContext;import ponents.logger.LogFactory;import org.
9、apache.axis.handlers.BasicHandler;import org.apache.axis.message.SOAPBodyElement;import org.apache.axis.message.SOAPEnvelope;import org.apache.axis.utils.XMLUtils;import mons.logging.Log;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.ls.DOMImplementationLS;import org.w3c.d
10、om.ls.LSSerializer;public class ZResponseHandler extends BasicHandler protected static Log log = LogFactory.getLog(ZResponseHandler.class.getName();public void invoke(MessageContext msgContext) throws AxisFault /* Response handler to write custom Ariba response */ try String Msg_id = msgContext.getS
11、trProp("request.id"); ("PI messageid is "+Msg_id); if (Msg_id.equals("") Msg_id = "0001" String respTxt = createResponseText(Msg_id); /* * Getting response soap message envelop and add * response message to soap body */ /MessageFactory messageFactory =
12、 MessageFactory.newInstance(); MessageFactory messageFactory = new org.apache.axis.soap.MessageFactoryImpl(); / SOAPMessage curMsg = messageFactory.createMessage(new MimeHeaders(), / new ByteArrayInputStream(respTxt.getBytes(Charset.forName("UTF-8"); /getSoapMessageFromString(respTxt); /se
13、tValue(respTxt); / SOAPMessage curMsg = messageFactory.createMessage(); SOAPMessage msg = messageFactory.createMessage(new MimeHeaders(), new ByteArrayInputStream(respTxt.getBytes(Charset.forName("UTF-8"); /curMsg.getSOAPPart().getEnvelope().setTextContent(respTxt); msgContext.setMessage(m
14、sg); catch (Exception e) throw AxisFault.makeFault(e); private String createResponseText(String msgid) String payloadID = "1234" / Get time stamp in GMT-800 format. String ts = getTimeStamp(); String respText = "<?xml version="1.0" encoding="UTF-8"?>rn"+
15、 "<SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Header/>rn" + "<SOAP-ENV:Body>"+ "<cXML payloadID=""+payloadID+"" xml:lang="en" timestamp=""+ts+"">rn&
16、quot; + "<Response>rn" + "<Status code="200" text="OK"/>rn" + "<Msg_id>"+msgid+"</Msg_id>"+ "</Response>rn" + "</cXML>rn" + "</SOAP-ENV:Body>rn" + "</SOAP-ENV:E
17、nvelope>" return respText; private String getTimeStamp() Date today = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); /root.setAttribute("timestamp","2002-03-12T18:39:09-08:00"); sdf.setTimeZone(TimeZone.getTimeZone(&qu
18、ot;GMT-08:00"); / String zone = TimeZone.getAvailableIDs(); /* for(int i =0;i<zone.length;i+) System.out.println(zonei); */ String timeStamp = sdf.format(today); / System.out.println(timeStamp); return timeStamp; 主要是把PI產生的MESSAGE ID也一并反饋給外圍系統(tǒng)用于跟蹤與確認。NTLM Handler類:package com.sap.aii.axis.sam
19、ple.handlers;import java.io.ByteArrayOutputStream;import java.io.IOException;import .URL;import java.util.ArrayList;import java.util.Hashtable;import java.util.Iterator;import javax.xml.soap.MimeHeader;import javax.xml.soap.MimeHeaders;import javax.xml.soap.SOAPException;import javax.xml.soap.SOAPPa
20、rt;import org.apache.axis.AxisFault;import org.apache.axis.Constants;import org.apache.axis.Message;import org.apache.axis.MessageContext;import .CommonsHTTPClientProperties;import .CommonsHTTPClientPropertiesFactory;import org.apache.axis.handlers.BasicHandler;import org.apache.axis.message.SOAPEnv
21、elope;import org.apache.axis.soap.SOAPConstants;import org.apache.axis.transport.http.HTTPConstants;import org.apache.axis.utils.Messages;import org.apache.axis.utils.NetworkUtils;import mons.logging.Log;import mons.logging.LogFactory;import org.apache.http.Header;import org.apache.http.HeaderElemen
22、t;import org.apache.http.HttpEntity;import org.apache.http.HttpEntityEnclosingRequest;import org.apache.http.HttpException;import org.apache.http.HttpHost;import org.apache.http.HttpRequest;import org.apache.http.HttpRequestInterceptor;import org.apache.http.HttpResponse;import org.apache.http.HttpV
23、ersion;import org.apache.http.ProtocolException;import org.apache.http.auth.AuthScope;import org.apache.http.auth.NTCredentials;import org.apache.http.auth.UsernamePasswordCredentials;import org.apache.http.client.AuthCache;import org.apache.http.client.CredentialsProvider;import org.apache.http.cli
24、ent.config.RequestConfig;import org.apache.http.client.entity.EntityBuilder;import org.apache.http.client.entity.GzipDecompressingEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org
25、.apache.http.client.methods.HttpPut;import org.apache.http.client.methods.HttpRequestBase;import tocol.HttpClientContext;import org.apache.http.config.RegistryBuilder;import org.apache.http.conn.socket.PlainConnectionSocketFactory;import org.apache.http.entity.AbstractHttpE
26、ntity;import org.apache.http.entity.ContentType;import org.apache.http.impl.auth.BasicScheme;import org.apache.http.impl.auth.DigestScheme;import org.apache.http.impl.client.BasicAuthCache;import org.apache.http.impl.client.BasicCredentialsProvider;import org.apache.http.impl.client.CloseableHttpCli
27、ent;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.message.BasicHeader;import tocol.HttpContext;import org.apache.http.util.EntityUtils;i
28、mport .AXISSocketFactory;import com.sap.aii.axis.utils.JavaUtils;public class Myntlm extends BasicHandler /* * */private static final long serialVersionUID = 1L;protected static Log log = LogFactory.getLog("com.sap.aii.axis.sample.handlers.Myntlm");PlainConnectionSocketFactory plainsf;bool
29、ean checkForDefaultPort;boolean authenticationPreemptive;CloseableHttpClient httpclient;CommonsHTTPClientProperties clientProperties;boolean httpChunkStream;public void init()super.init();authenticationPreemptive = Boolean.valueOf(String)getOption("http.authentication.preemptive").booleanV
30、alue();clientProperties = CommonsHTTPClientPropertiesFactory.create();public Myntlm() /useChunckedStream = true;clientProperties = null;httpChunkStream = true;plainsf = null;/layeredsf = null;checkForDefaultPort = false;/sendAcceptEnc = false;initialize();private void initialize()plainsf = new Plain
31、ConnectionSocketFactory();/layeredsf = new IAIKHttpClientSocketFactory();public void invoke(MessageContext msgContext) throws AxisFault HttpRequestBase method = null;HttpClientBuilder httpclientbuilder = null;httpclient = null;HttpEntity respBody = null;try URL targetURL = new URL(msgContext.getStrP
32、rop("transport.url");checkForDefaultPort = Boolean.parseBoolean(String) msgContext.getProperty("checkForDefaultPort");HttpClientContext context = HttpClientContext.create();httpclientbuilder = createHttpClient(msgContext, context, targetURL);RequestConfig reqConf = createRequestC
33、onfig(msgContext, targetURL,httpclientbuilder);boolean restful = Boolean.valueOf(msgContext.getStrProp("enableREST").booleanValue();boolean posting = true;String webMethod = null;if (msgContext.getSOAPConstants() = SOAPConstants.SOAP12_CONSTANTS)webMethod = msgContext.getStrProp("soap
34、12.webmethod");if (webMethod = null)webMethod = "POST"elseposting = webMethod.equals("POST") | webMethod.equals("PUT");if (posting) if (webMethod.equalsIgnoreCase("put")method = new HttpPut(targetURL.getFile();elsemethod = new HttpPost(targetURL.getFile()
35、; else method = new HttpGet(targetURL.toURI();addContextInfo(method, reqConf, msgContext, targetURL);method.setConfig(reqConf);String httpVersion = msgContext.getStrProp("axis.transport.version");if (httpVersion != null && httpVersion.equalsIgnoreCase("HTTP/1.0")method.se
36、tProtocolVersion(HttpVersion.HTTP_1_0);elsemethod.setProtocolVersion(HttpVersion.HTTP_1_1);ByteArrayOutputStream binReq = new ByteArrayOutputStream();String contentType = "text/xml"Message reqMsg = msgContext.getRequestMessage();if (reqMsg != null) if (restful) SOAPPart part = reqMsg.getSO
37、APPart();String types = part.getMimeHeader("Content-Type");if (types != null && types.length > 0)contentType = types0;if (!contentType.equalsIgnoreCase(method.getFirstHeader("Content-Type").getValue() method.removeHeaders("Content-Type");method.addHeader(&quo
38、t;Content-Type", contentType);reqMsg.setMessageContext(null);reqMsg.setProperty("javax.xml.soap.write-xml-declaration","false");log.debug(new StringBuilder().append("rest message is: ").append(new String(reqMsg.getSOAPPartAsBytes().toString(); else contentType = re
39、qMsg.getContentType(msgContext.getSOAPConstants();reqMsg.writeTo(binReq);log.debug(new StringBuilder().append("Content type of request message determined to: ").append(contentType).toString();HttpEntity reqEntity = null;if (posting) EntityBuilder reqBuilder = EntityBuilder.create();reqBuil
40、der.setBinary(binReq.toByteArray();if (msgContext.isPropertyTrue("transport.http.gzipRequest")reqBuilder.gzipCompress();else if (reqBuilder.isGzipCompress()reqBuilder.gzipCompress();reqBuilder.setContentType(ContentType.create(contentType);reqEntity = reqBuilder.build();if (method.contains
41、Header(HTTPConstants.HEADER_TRANSFER_ENCODING) log.debug("removing old content encoding value.");method.removeHeaders(HTTPConstants.HEADER_TRANSFER_ENCODING);log.debug(new StringBuilder().append("setting chunked to ").append(httpChunkStream).toString();(AbstractHttpEntity) reqEnt
42、ity).setChunked(httpChunkStream);(HttpEntityEnclosingRequest) method).setEntity(reqEntity);HttpHost target = new HttpHost(targetURL.getHost(), targetURL.getPort(), targetURL.getProtocol();httpclient = httpclientbuilder.build();log.debug(new StringBuilder().append("target configured to: ").
43、append(target.toString().append(" and calling it .").toString();CloseableHttpResponse resp = httpclient.execute(target, method,context);int respCode = resp.getStatusLine().getStatusCode();log.debug(new StringBuilder().append("Called successfully with HTTP code: ").append(respCode
44、).toString();contentType = getHeader(resp, "Content-Type");String contentLocation = getHeader(resp, "Content-Location");String contentLength = getHeader(resp, "Content-Length");if (respCode <= 199 | respCode >= 300)&& ("text/html".equalsIgnoreCas
45、e(contentType)| respCode <= 499 | respCode >= 600) String statusMessage = resp.getStatusLine().getReasonPhrase();AxisFault fault = new AxisFault("HTTP", (new StringBuilder().append("(").append(respCode).append(")").append(statusMessage).toString(), null, null);fau
46、lt.setFaultDetailString(Messages.getMessage("return01",(new StringBuilder().append("").append(EntityUtils.toString(resp.getEntity().toString();fault.addFaultDetail(Constants.QNAME_FAULTDETAIL_HTTPERRORCODE,Integer.toString(respCode);throw fault;respBody = resp.getEntity();Header
47、contEnc = respBody.getContentEncoding();if (contEnc != null) HeaderElement elems = contEnc.getElements();HeaderElement arr$ = elems;int len$ = arr$.length;for (int i$ = 0; i$ < len$; i$+) HeaderElement el = arr$i$;if ("gzip".equalsIgnoreCase(el.getName() respBody = new GzipDecompressing
48、Entity(respBody);resp.setEntity(respBody);Header responseHeaders = resp.getAllHeaders();String enc = EntityUtils.getContentCharSet(respBody);if (enc = null)enc = "iso-8859-1"Message outMsg = null;log.debug(new StringBuilder().append("Content type of response message determined to: &qu
49、ot;).append(contentType).toString();if (restful) outMsg = new Message(JavaUtils.createXMLInputStream(respBody.getContent(), enc, "UTF-8", false), false,contentType, contentLocation);outMsg.getSOAPPart().setMimeHeader("Content-Type", contentType);try outMsg.setProperty("javax
50、.xml.soap.character-set-encoding","UTF-8"); catch (SOAPException e) log.debug("Error while setting message encoding", e); else if (contentLength != null&& "0".equalsIgnoreCase(contentLength)outMsg = new Message(new SOAPEnvelope();elseoutMsg = new Message(re
51、spBody.getContent(), false, contentType,contentLocation);outMsg.getSOAPPartAsString();MimeHeaders responseMimeHeaders = outMsg.getMimeHeaders();for (int i = 0; i < responseHeaders.length; i+) Header responseHeader = responseHeadersi;responseMimeHeaders.addHeader(responseHeader.getName(),responseH
52、eader.getValue();outMsg.setMessageType("response");msgContext.setResponseMessage(outMsg);if (msgContext.getMaintainSession() Header headers = resp.getAllHeaders();for (int i = 0; i < headers.length; i+) if (headersi.getName().equalsIgnoreCase("Set-Cookie") handleCookie("C
53、ookie", headersi.getValue(),msgContext);continue;if (headersi.getName().equalsIgnoreCase("Set-Cookie2")handleCookie("Cookie2", headersi.getValue(),msgContext); catch (Exception e) log.debug("Error ", e);throw new AxisFault("Error while invoking HttpClientSender: ", e);if (httpclient != null)try httpclient.close(); catch (IOException e) log.debug("Error while closing http client: ", e)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CMES 02002-2024鋁及鋁合金焊絲產品質量等級評價規(guī)范
- T/CEMIA 040-202499氧化鋁陶瓷用造粒粉
- T/CSPSTC 133-2024地鐵隧道毛細管換熱系統(tǒng)技術規(guī)程
- T/CMA JY-122-2024燃油加油機檢測安全操作規(guī)范
- 上海社區(qū)考試真題及答案
- 制作大豆農田轉讓合同8篇
- 借款合同(附擔保條款)5篇
- 【課件】氧氣-2024-2025學年九年級化學人教版(2024)上冊
- 基礎建設工程儲備設備貸款合同7篇
- 辦公室衛(wèi)生評比
- 報修申請表(完整版)
- MOOC 財務報表分析-華中科技大學 中國大學慕課答案
- 師帶徒培養(yǎng)方案范文
- 山東萊陽核電項目一期工程水土保持方案
- 臨床醫(yī)學概論課程的婦產科學與生殖醫(yī)學
- 2024年中國鐵路物資西安有限公司招聘筆試參考題庫含答案解析
- PDCA降低護士針刺傷發(fā)生率
- 幼兒園大班美術《臉部彩繪》
- 2021年安全生產月:安全執(zhí)行力培養(yǎng)專題培訓課件
- 陜西碑刻總目提要編纂凡例
- GB/T 3785.1-2023電聲學聲級計第1部分:規(guī)范
評論
0/150
提交評論