亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

處理鏈處理WEB服務中的請求/響應消息

2019-11-18 12:31:26
字體:
來源:轉載
供稿:網友

為什么使用處理鏈?

  一個處理程序可以在客戶端或服務器端用來創建一個SOAP的請求消息和響應消息。例如一個使用消息處理程序的簡單例子,在SOAP消息中的實體部分對數據進行加密和解密,客戶端在他向WEB服務發送SOAP請求消息前必須使用消息處理程序對消息進行加密,WEB服務收到請求后,在它將數據發送到后臺實現WEB服務之前,必須使用消息處理程序對從客戶端發送過來的消息進行解密。與請求消息的傳輸方向相反,SOAP響應消息也要執行相同的步驟。

  另外一個例子,在SOAP消息的頭部分訪問信息進行處理。SOAP頭經常用來存儲WEB服務具體說明信息并且使用消息處理程序來操作它。例如將用戶名和密碼可以放在SOAP消息的頭部分中來發送到驗證處理程序。

  SOAP消息處理可以用來提高WEB服務的使用效率。這種方法的實現可以通過使用隊列緩沖SOAP響應的次序。處理程序可以使SOAP的請求信息生效并且將消息交互紀錄下來。

處理鏈:

  處理鏈就是將每一個消息處理裝配成一個鏈表形式進行處理。在WEB服務中實現可能需要調用多個處理類,用來提供處理請求/響應前面或后面的服務。JAX-RPC運行環境中可以在鏈表中調用多個處理類。這種處理消息的概念稱為處理鏈。

處理鏈模型:

  一個消息處理類功能主要在客戶服務器端通信中,盡可能的為終端服務和可以設置用來截取SOAP消息并且在以下幾種情況下對消息執行各種操作:

1)在客戶端,在SOAP請求被建立后并且在發送到WEB服務之前
2)在WEB服務端,在SOAP消息請求被WEB服務程序處理之前
3)在WEB服務端,在WEB服務發送SOAP消息響應之前
4)在客戶端,在JAX-RPC運行時處理從WEB服務中收到的SOAP響應之前
消息處理鏈可以使用后臺組件也可以不使用,下面主要針對各種處理情況?

處理鏈處理WEB服務中的請求/響應消息(圖一)
(圖1)
圖一描述了使用后臺組件進行處理鏈操作。當客戶端調用WEB服務時,SOAP請求到達處理鏈中的處理請求部分,一旦處理通過,處理程序將消息傳送到WEB服務中并且執行。處理響應程序被WEB服務調用并且將SOAP響應發送到客戶端。

處理鏈處理WEB服務中的請求/響應消息(圖二)
圖2使用后臺組件的處理鏈模型

舉例:

  這個例子我們采用的服務為WEBLOGIC8.X,這里我們通過后臺組件提供查詢服務的驗證處理程序來具體說明。這里面的驗證內容主要是帳號和個人識別碼,它們被放在SOAP請求消息的頭部分中,消息處理程序將重新獲得帳號和個人識別碼并驗證,假如驗證通過,一旦通過驗證,后臺組件將會調用余額查詢來獲得此帳號的余額。

以下就是寫一個處理程序的步驟:
1)處理程序必須實現javax.xml.rpc.handler.Handler 接口或繼續Weblogic中的GenericHandler 類。
2)javax.xml.rpc.handler.Handler 接口包含了以下這些方法用來實現

init () 
destroy()
getHeaders()
handleRequest()
handleResponse()
handleFault()


  假如使用weblogic.webservice.GenericHandler 類,只需要重寫必須的方法,
在這個例子中驗證處理程序重寫了handleRequest() 和handleResponse() 方法。
假如handleRequest()方法返回true,將會調用處理鏈中的下一個處理程序,
假如這個處理程序是處理鏈中最后一個元素,將會調用后臺的WEB服務程序。
假如  handleRequest()方法返回false,對應的handleResponse()方法將會被調用。
驗證處理程序中handleRequest() 將從SOAP的頭部分中重新獲得帳號和個人識別碼,
并且驗證后要返回true 或false結果。

AuthenticationHandler.java


import java.util.Map;
import java.util.Iterator;

import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.namespace.QName;
import javax.xml.soap.*;

import weblogic.webservice.GenericHandler;

public class AuthenticationHandler extends GenericHandler
{

   PRivate int me = System.identityHashCode(this);

   private HandlerInfo handlerInfo = null;
   String accountNo                = null;
   String pin                      = null;

   public void init(HandlerInfo handlerInfo)
   {
      this.handlerInfo = handlerInfo;
   }
   public boolean handleRequest(MessageContext messageContext)
   {
      System.err.println("** handleRequest called in: "+me);
      try
      {
         SOAPMessageContext sctx = (SOAPMessageContext)messageContext;
         SOAPMessage message     = sctx.getMessage();
         SOAPPart sp             = message.getSOAPPart();
         SOAPEnvelope senv       = sp.getEnvelope();
         SOAPHeader sh           = senv.getHeader();

         Iterator iter =  sh.getChildElements();
         if(iter.hasNext())
         {
            iter.next();                 //skip text
            Object obj = iter.next();    //account details
            SOAPElement elt = (SOAPElement)obj;
            iter = elt.getChildElements();
            iter.next();                 //skip text node
            obj = iter.next();
            elt = (SOAPElement)obj;
            accountNo = elt.getValue();
            iter.next();                 //skip text node
            obj = iter.next();
            elt = (SOAPElement)obj;
            pin = elt.getValue();
         }
      }
      catch (Exception e)
      {
         e.printStackTrace();
         throw new JAXRPCException(e);
      }
      if(accountNo.equals("12345") && pin.equals("6789"))
         return true;
      else
         return false;
   }
   public boolean handleResponse(MessageContext messageContext)
   {
      System.out.println("Inside HandleResponse");
      return true;

   }
   public QName[] getHeaders()
   {
      return handlerInfo.getHeaders();
   }
}


以下就是余額查詢的代碼,是一個非常簡單的服務返回給出已知帳號的余額。
BalanceEnquiryService.java

public class BalanceEnquiryService
{
   public float getBalance(String accountNo)
   {
      if(accountNo.equals("12345"))
         return 5000f;
      else
         return 100f;
   }
}


  WEB服務中的web-service.xml 必須要修改為包含處理鏈的描述,下面幾個部分需要在web-service.xml 中修改的:

1)在 的根元素中創建一個 子元素,在這個子元素中包含了WEB服務中一系列處理鏈程序的定義。
2)創建的子元素 ,在這個子元素中,顯示了所有處理鏈中的處理程序。對于每一個處理程序,使用類名必須指定 java類的全限定名以便實現處理程序。使用元素來指定處理程序的初始化參數。

  
      
      
      
  




3.使用(它本身是 的子元素)的子元素元素,來具體說明處理鏈是WEB服務中的一個操作?!?br />
 注重:處理鏈只是自執行的,沒有后臺組件參與執行,在這中情況下,只要使用處理鏈屬性中的元素并且并不需要指定組件或方法的屬性,就像下面所選其中的一部分:

  
      <OperaTION name="chainService"
                 handler-chain="myChain" />
  



這里有一個完整的WEB.xml的例子:
web-service.xml

  
                   uri="/BalanceEnquiryService"
                targetNamespace="http://www.bea.com">
      
                              class-name="BalanceEnquiryService">
        

      

      
                             handler-chain="AuthenticationHandlerChain"
                    component="jccomp0">
            
                                              style="in" type="xsd:string" />
                                            class-name="java.lang.Float"
                                           type="xsd:float" />
            

  
  這里面處理鏈的名字叫做AuthenticationHandlerChain,
這里面包含了一個AuthenticationHandler處理程序,注重,
在操作中包含了操作屬性handler-chain="AuthenticationHandlerChain".
  這里給出了ant腳本build.xml用來打包EAR,注重在打包之前必須有Web.xml 和 application.xml
build.xml
























                          destdir="${build}/WEB-INF/classes" />





















  ant腳本在創建WAR文件的同時也進行EAR打包,在WEBLOGIC服務器上部署打包好的EAR文件,
下面是客戶端調用余額查詢的程序:
Client.java

import org.apache.axis.client.Call;
import org.apache.axis.client.ServiceFactory;
import org.apache.axis.client.Service;
import org.apache.axis.MessageContext;
import org.apache.axis.attachments.Attachments;
import org.apache.axis.message.SOAPEnvelope;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Name;
import javax.xml.rpc.ParameterMode;

import java.net.URL;
import java.util.Iterator;


public class Client
{
   private static String TARGET_NAMESPACE = "http://www.bea.com";
   private static QName xsdFloat = new
                  QName("http://www.w3.org/2001/XMLSchema", "float");
   public static org.apache.axis.message.SOAPEnvelope env = null;
   public static SOAPMessage message = null;
   public static void main(String[] argv) throws Exception
   {
      Client client = new Client();
      env = client.constrUCtSOAPEnvelope();
      client.constructHeader(env);
      client.constructBody(env);
      System.setProperty( "javax.xml.rpc.ServiceFactory",
                          "org.apache.axis.client.ServiceFactory" );

      String url =
     "http://localhost:7001/BalanceEnquiry/BalanceEnquiryService";
     ServiceFactory factory =
         (org.apache.axis.client.ServiceFactory)ServiceFactory.
              newInstance();
      QName serviceName   = new QName(TARGET_NAMESPACE,
         "BalanceEnquiryService");

      Service service =
         (org.apache.axis.client.Service)factory.
          createService(serviceName);
      Call call = (org.apache.axis.client.Call)service.createCall();
      call.setTargetEndpointAddress(url);
      SOAPEnvelope result = call.invoke(env);
      System.out.println(result);
   }
   public SOAPEnvelope constructSOAPEnvelope() throws Exception
   {
      org.apache.axis.message.SOAPEnvelope env = new
         org.apache.axis.message.SOAPEnvelope();
      return env;
   }
   public void constructHeader(SOAPEnvelope envelope) throws Exception
   {
      SOAPHeader header = envelope.getHeader();
      Name headerElementName =
         envelope.createName("AccountDetails","",
                             "http://schemas.xmlsoap.org/soap/
                                     envelope/");
      SOAPHeaderElement headerElement =
         header.addHeaderElement(headerElementName);
      headerElement.setMustUnderstand(false);
      headerElement.addNamespaceDeclaration("soap",
         "http://schemas.xmlsoap.org/soap/envelope/");
      SOAPElement accNo = headerElement.addChildElement("accountNo");
      accNo.addTextNode("12345");
      SOAPElement pinNo = headerElement.addChildElement("pin");
      pinNo.addTextNode("6789");
   }

   public void constructBody(SOAPEnvelope envelope) throws Exception
   {
      SOAPBody body = envelope.getBody();
      Name bodyRootElementName =
         envelope.createName("getBalance","",
                             "http://schemas.xmlsoap.org/soap/
                                     encoding/");
      SOAPBodyElement bodyRootElement =
         body.addBodyElement(bodyRootElementName);
      SOAPElement bodyElement =
         bodyRootElement.addChildElement("param0");
      bodyElement.addAttribute(envelope.createName("xsi:type"),
                                                   "xsd:string");
      bodyElement.addTextNode("12");
   }
}



假如在客戶端也有一個處理程序,以下部分要發生變化:
(1)導入import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.HandlerRegistry;兩個類。

(2)在call().invoke前面加:
QName portName = new QName( "http://bea.com/", 
                            "HelloWorldServicePort");
HandlerRegistry registry = service.getHandlerRegistry();
List handlerList = new ArrayList();
handlerList.add( new HandlerInfo( ClientHandler.class, null,null ) );
registry.setHandlerChain( portName, handlerList );


結論:
  我們希望能讓大家更多的了解關于處理鏈機制并且應用到WEB服務中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成人精品视频| 亚洲免费av片| 国产精品视频永久免费播放| 国产精品一区av| 亚洲国产日韩精品在线| 久久99热这里只有精品国产| 久久免费视频在线| 色综合天天狠天天透天天伊人| 精品中文视频在线| 亚洲人成网在线播放| 法国裸体一区二区| 国产综合久久久久久| 日本一区二区三区在线播放| 欧美在线视频免费| 久久久久久久电影一区| 久久视频在线看| 国产香蕉一区二区三区在线视频| 久久伊人免费视频| 欧美国产中文字幕| 欧美性猛交xxxx久久久| 国产精品爽爽爽爽爽爽在线观看| 精品性高朝久久久久久久| 亚洲欧美日韩第一区| 国产亚洲日本欧美韩国| 国产丝袜一区二区| 国产日韩中文在线| 日韩精品视频免费专区在线播放| 亚洲自拍偷拍色片视频| 久久精品国产精品| 97超级碰在线看视频免费在线看| 国模叶桐国产精品一区| 国产91精品久久久久久| 日韩欧美在线国产| 久久中文字幕在线视频| 国产99久久精品一区二区| 欧美在线中文字幕| 欧洲成人免费视频| 亚洲第一福利网| 日韩在线播放av| 亚洲自拍欧美另类| 色先锋资源久久综合5566| 国产精品久久久久一区二区| 日韩成人高清在线| 免费不卡在线观看av| 97国产真实伦对白精彩视频8| 久久久久久久网站| 亚洲字幕在线观看| 成人免费xxxxx在线观看| 欧美在线性视频| 日韩国产欧美区| 亚洲精品日韩激情在线电影| 精品国产网站地址| 亚洲的天堂在线中文字幕| 91久久精品久久国产性色也91| 欧美电影免费观看高清完整| 精品日本美女福利在线观看| 亚洲第一黄色网| 亚洲热线99精品视频| 欧美一级大片在线观看| 国产日本欧美视频| 欧美资源在线观看| 国产精品自产拍在线观看| 国产成人精品亚洲精品| 久久男人资源视频| 91热福利电影| 国产精品国产自产拍高清av水多| 日韩久久精品电影| 欧美人在线观看| 精品国产电影一区| 亚洲综合成人婷婷小说| 精品美女国产在线| 久久久精品视频成人| 欧美区在线播放| 久久精品久久久久久| 国产精品91久久久| 欧美性在线视频| 91精品国产综合久久香蕉最新版| 亚洲国产成人精品电影| 久久91精品国产91久久跳| 亚洲伊人一本大道中文字幕| 亚洲一区二区中文| 亚洲自拍小视频免费观看| 欧美成人激情在线| 日韩美女激情视频| 日韩欧美黄色动漫| 久久九九热免费视频| 亚洲国产精品久久精品怡红院| 91久久久久久久久久| 丝袜情趣国产精品| 亚洲欧美国产一区二区三区| 91福利视频在线观看| 国产在线98福利播放视频| 久久理论片午夜琪琪电影网| 国产日韩欧美在线播放| 亚洲3p在线观看| 欧美一级免费视频| 亚洲精品久久视频| 日韩av综合中文字幕| 欧美大片欧美激情性色a∨久久| 欧美性xxxxhd| 久久久久亚洲精品国产| 日韩精品免费在线| 亚洲丝袜在线视频| 日本一区二区三区四区视频| 欧美大胆在线视频| 日韩中文字幕在线| 26uuu亚洲伊人春色| 亚洲欧美国产一本综合首页| 久久久精品视频在线观看| 久久久久免费视频| 综合欧美国产视频二区| 深夜福利91大全| 国产精品私拍pans大尺度在线| 九九久久综合网站| 亚洲电影免费观看高清| 中文字幕欧美亚洲| 亚洲成人久久网| 亚洲人成网在线播放| 国产99久久精品一区二区 夜夜躁日日躁| 久久久精品一区| xxxxx91麻豆| 欧美日韩国产精品专区| 亚洲国产成人精品电影| 久久天天躁狠狠躁夜夜爽蜜月| 69av视频在线播放| 久久久精品国产网站| 欧美激情网友自拍| 欧美一级在线亚洲天堂| 国产精品视频一区二区三区四| 国产欧美 在线欧美| 欧美在线视频导航| 综合国产在线视频| 亚洲一品av免费观看| 日韩在线中文字| 国产成人久久久| 欧美中文字幕视频| 国产精品中文字幕在线观看| 久久韩剧网电视剧| 精品久久久av| 久久精品亚洲94久久精品| 97超级碰碰碰久久久| 中文字幕综合在线| 成人黄色av免费在线观看| 久久久久久久一区二区三区| 国产成人精品一区| 中文字幕精品av| 亚洲成人网在线观看| 国产专区精品视频| 91精品国产高清自在线| 国产精品美乳一区二区免费| 久久久久中文字幕2018| 国产在线精品一区免费香蕉| 精品福利一区二区| 国产精品九九久久久久久久| 91久久夜色精品国产网站| 亚洲欧美日本精品| 欧美成人黑人xx视频免费观看| 国产91精品高潮白浆喷水| 久久精品免费播放| 成人免费福利在线| 亚洲人a成www在线影院| 国产精自产拍久久久久久蜜| 久久久免费av| 国产精品igao视频|