SOAPハンドラは、SOAPメッセージインターセプタであり、着信または発信SOAPメッセージを代行受信し、その値を操作できます。たとえば、クライアント側でSOAPハンドラを添付します。SOAPハンドラは、クライアントから送信されるすべての送信SOAPメッセージのSOAPヘッダーブロックにクライアントのコンピュータMACアドレスを挿入します。サーバ側では、別のSOAPハンドラを添付して、受信したすべてのSOAPメッセージからSOAPヘッダーブロック内のクライアントのMACアドレスを取り戻します。サーバー側では、公開されているサービスにアクセスできるコンピュータを特定することができます。
この記事は3つの部分に分かれています:
-
JAX-WS:サーバー側のSOAPハンドラ. (この記事)
-
jax-ws-jax-ws-soap-handler-in-client-side/[JAX-WS:
クライアントサイドのSOAPハンドラ]。リンク://webservices/jax-ws/jax-ws-soap-handler-testing-client-and-server-side/[JAX-WS
: SOAP handler testing for client and server side]
サーバ側のSOAPハンドラ
この記事では、SOAPハンドラを作成してサーバ側で添付して、着信SOAPメッセージからSOAPヘッダブロックのmacアドレスを取得する方法を説明します。 MACアドレス ”
90-4C-E5-44-B9-8F
“のコンピュータのみがこの公開されたサービスにアクセスできるように検証してください。
無効なクライアントがサービスにアクセスしようとすると、 `SOAPFaultException`をクライアントに戻します。
この例のディレクトリ構造
1. Webサービス
簡単なWebサービス。文字列を返す `getServerName()`メソッドがあります。
File:ServerInfo.java
package com.mkyong.ws;
import javax.jws.HandlerChain;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class ServerInfo{
@WebMethod
public String getServerName() {
return "mkyong server";
}
}
Webサービスのデプロイメントに必要なJavaファイルを生成します。
D:\workspace-new\WebServices\bin>wsgen -keep -verbose -cp . com.mkyong.ws.ServerInfo Note: ap round: 1 ... com \ mkyong \ ws \ jaxws \ GetServerName.java com \ mkyong \ ws \ jaxws \ GetServerNameResponse.java 注:ap round:2
2つのファイルが生成されます。
。 com \ mkyong \ ws \ jaxws \ GetServerName.java
。 com \ mkyong \ ws \ jaxws \ GetServerNameResponse.java
File:GetServerName.java
パッケージcom.mkyong.ws.jaxws;
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType;
@XmlRootElement(name = "getServerName"、namespace = "http://ws.mkyong.com/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getServerName"、namespace = "http://ws.mkyong.com/")
パブリッククラスGetServerName {
}
File:GetServerNameResponse.java
パッケージcom.mkyong.ws.jaxws;
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType;
@ XmlType(name = "getServerNameResponse"、namespace = "http://ws.mkyong.com/")@XmlAccessorType(XmlAccessType.FIELD)@ XmlType(name = "getServerNameResponse"、namespace = "http://ws.mkyong .com/")public class GetServerNameResponse {
@XmlElement(name = "return"、namespace = "")プライベートString __return;
/** ** ** ** @return ** はStringを返します。** /public String getReturn(){return this.__return; }
/** ** ** ** @param __return ** __returnプロパティの値** /public void setReturn(String __return){this.__return = __return; }
}
2. SOAPハンドラ
SOAPヘッダーブロックの値を取得するためのSOAPハンドラーを作成します。
すべての着信SOAPメッセージコードの説明については、コメントを参照してください。
File MacAddressValidatorHandler.java
パッケージcom.mkyong.handler;
import java.io.IOException; import java.util.Iterator; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.soap.Node; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFault; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import javax.xml.ws.soap.SOAPFaultException;
パブリッククラスMacAddressValidatorHandlerは、SOAPHandler <SOAPMessageContext> {
@Override public boolean handleMessage(SOAPMessageContextコンテキスト)
System.out.println( "Server:handleMessage()......");ブールisRequest =(ブール)context.get(MessageContext.MESSAGE__OUTBOUND__PROPERTY);
//for response message only, true for outbound messages, false for inbound if(!isRequest){ try{ SOAPMessage soapMsg = context.getMessage(); SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope(); SOAPHeader soapHeader = soapEnv.getHeader(); //if no header, add one if (soapHeader == null){ soapHeader = soapEnv.addHeader(); //throw exception generateSOAPErrMessage(soapMsg, "No SOAP header."); }
//Get client mac address from SOAP header Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI__SOAP__ACTOR__NEXT); //if no header block for next actor found? throw exception if (it == null || !it.hasNext()){ generateSOAPErrMessage(soapMsg, "No header block for next actor."); } //if no mac address found? throw exception Node macNode = (Node) it.next(); String macValue = (macNode == null) ? null : macNode.getValue(); if (macValue == null){ generateSOAPErrMessage(soapMsg, "No mac address in header block."); }
//if mac address is not match, throw exception if(!macValue.equals("90-4C-E5-44-B9-8F")){ generateSOAPErrMessage(soapMsg, "Invalid mac address, access is denied."); } //tracking soapMsg.writeTo(System.out);
} catch(SOAPException e){System.err.println(e);} } catch(IOException e){System.err.println(e);} }}
//continue other handler chain return true; }
@Override public boolean handleFault(SOAPMessageContextコンテキスト){System.out.println( "サーバー:handleFault()......");真を返します。 }
@Override public void close(MessageContext context){System.out.println( "サーバー:閉じる()......"); }
@Override public Set <QName> getHeaders(){System.out.println( "サーバー:getHeaders()......"); nullを返す。 (SOAPMessage msg、String reason){SOAPBody soapBody = msg.getSOAPPart()。getEnvelope()。getBody(); SOAPFault soapFault = soapBody.addFault(); soapFault.setFaultString(理由);新しいSOAPFaultExceptionをスローする(soapFault); } catch(SOAPException e){}}
}
3. SOAPハンドラXMLファイル
SOAPハンドラーXMLファイルを作成し、SOAPハンドラー宣言を置きます。
File:handler-chain.xml
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?> <javaee:handler-chains xmlns:javaee = "http://java.sun.com/xml/ns/javaee" xmlns:xsd = "http://www.w3.org/2001/XMLSchema"> <javaee:handler-chain> <javaee:handler> <javaee:handler-class> com.mkyong.handler.MacAddressValidatorHandler </javaee:handler-class> </javaee:handler> </javaee:handler-chain> </javaee:handler-chains>
4. SOAPハンドラ – > Webサービスを添付します。
上記のSOAPハンドラをWebサービス `ServerInfo.java`に添付するには、
@ HandlerChain
でアノテートし、SOAPハンドラファイル名を指定する
内部。
File:ServerInfo.java
パッケージcom.mkyong.ws;
import javax.jws.HandlerChain; import javax.jws.WebMethod; import javax.jws.WebService;
@WebService @HandlerChain(file = "handler-chain.xml")publicクラスServerInfo {
@WebMethod public String getServerName(){戻り "mkyongサーバー"; }
}
5. Webサービスパブリッシャー
テスト用の単純なWebサービスパブリッシャ。
パッケージcom.mkyong.endpoint; import javax.xml.ws.Endpoint; import com.mkyong.ws.ServerInfo;
//Endpoint publisher
public class WsPublisher{
public static void main(String[]args) {
Endpoint.publish("http://localhost:8888/ws/server", new ServerInfo());
System.out.println("Service is published!");
}
}
Done, please proceed on next article –
Part 2 :
JAX-WS – SOAP handler in client side
.
Download Source Code
Download It –
JAX-WS-Handler-Example.zip
(21KB)