




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在某些场景中AXIS提供很强大的功能,包括添加消息头,提供NTLM等多种认证方式,进行ACK发送的功能,具体参考SAP 的AXIS FQA。本文档主要讲述PI的AXIS部署以及自定handler,涉及2个handler,一个用于外围系统异步发送系统的时候发生ACK给外围系统,另一个是PI采用Handler实现NTLM V2安全认证。PI7.31 SP15 ,PI7.4 SP10之后SAP推出了针对Apache HTTP Client library的补丁,参考note 2062567 - Integration of Apache HttpClient library in the PI Axis adapter可以实现NTLM V2。而对于这2个补丁之前的版本SAP不支持 NTLM V2协议。本例的方法是根据SAP的SP包中的相关类进行反编译后的源代码封装成自己的handler类。首先PI要支持AXIS,则需要部署com.sap.aii.af.axisproviderlib.sda部署情况可以通过网址http:/:/XIAxisAdapter/MessageServlet进行校验。用到下面的类:addressing-1.0.jaraxis-1.4.jarcommons-codec-1.9. jar(开始使用1.3版本,发现有bug: 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.jarwss4j-1.5.7.jarxalan-2.7.1.jarxmlsec-1.4.2.jar用工具sdaMakerTool进行压缩。如果是自己开发的handler类没有用到其他PI标准类的话也可以独立部署到这个包中,如果用到了其他类,其他的jar类也一并压缩到这个包中,并要进行加载,另外一种方式是把自定的handler类在SAP 的axis sample adapter中实现,参考AXIS的FQA.本文档中的两个类都是独立的类,用到的SAP标准的jar文件也压缩到其中。ACK handler类实现,网上有这个blog,照着blog实现。代码如下。package com.sap.aii.axis.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.SimpleDateFormat;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.SOAPException;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.TransformerFactoryConfigurationError;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.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.dom.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.getStrProp(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 = 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); /setValue(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(msg); 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 = rn+ rn + + rn + rn + rn + +msgid+ rn + rn + rn + ; return respText; private String getTimeStamp() Date today = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-ddTHH:mm:ssZ); /root.setAttribute(timestamp,2002-03-12T18:39:09-08:00); sdf.setTimeZone(TimeZone.getTimeZone(GMT-08:00); / String zone = TimeZone.getAvailableIDs(); /* for(int i =0;i 0)contentType = types0;if (!contentType.equalsIgnoreCase(method.getFirstHeader(Content-Type).getValue() method.removeHeaders(Content-Type);method.addHeader(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 = reqMsg.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();reqBuilder.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.containsHeader(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) reqEntity).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: ).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).toString();contentType = getHeader(resp, Content-Type);String contentLocation = getHeader(resp, Content-Location);String contentLength = getHeader(resp, Content-Length);if (respCode = 300)& (text/html.equalsIgnoreCase(contentType)| respCode = 600) String statusMessage = resp.getStatusLine().getReasonPhrase();AxisFault fault = new AxisFault(HTTP, (new StringBuilder().append().append(respCode).append().append(statusMessage).toString(), null, null);fault.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 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 GzipDecompressingEntity(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: ).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.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(respBody.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(),responseHeader.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(Cookie, 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);try httpclient.close(); catch (IOException e) log.debug(Error while closing http client: , e);public void handleCookie(String cookieName, String acookie,MessageContext msgContext) String ck = acookie
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 打假协议模板
- 时尚产品发布保证金合同
- 拍卖合同效力协议
- 植物采购与销售合同
- 幼儿园新冠肺炎疑似病例处理流程
- 四年级数学教学计划的社会实践活动
- 环保工程施工中的协作配合措施
- 建筑行业财务报销流程的标准化研究
- 钻井定向技术课件
- 医疗美容院顾客咨询服务流程
- 义务教育质量监测应急专项预案
- 13人物描写一组 两茎灯草 课件
- (正式版)SHT 3045-2024 石油化工管式炉热效率设计计算方法
- 广东省广州市2023年初中学业水平考试中考数学试卷【含答案】
- 刑法学教全套课件(完整)-2024鲜版
- 专题16.7 二次根式章末八大题型总结(拔尖篇)-八年级数学下册(人教版)(解析版)
- 2023流域超标准洪水防御预案编制导则
- 如何提高调查研究能力
- 农产品加工培训课件
- 城市轨道交通的智能调度与运营优化
- 计算机网络基础IP地址课件
评论
0/150
提交评论