Обработчик SOAP - это перехватчик сообщений SOAP, который может перехватывать входящее или исходящее сообщение SOAP и манипулировать его значениями. Например, подключите обработчик SOAP на стороне клиента, который будет вводить MAC-адрес компьютера клиента в блок заголовка SOAP для каждого исходящего сообщения SOAP, которое отправляется клиентом. На стороне сервера присоедините другой обработчик SOAP, чтобы получить обратно MAC-адрес клиента в блоке заголовка SOAP из каждого входящего сообщения SOAP. Чтобы серверная сторона могла определить, какому компьютеру разрешен доступ к опубликованному сервису.
Эта статья разделена на 3 части:
, JAX-WS: обработчик SOAP на стороне сервера. (Эта статья)
, ссылка://веб-сервисы/jax-ws/jax-ws-soaphandler-in-client-side/[JAX-WS:
Обработчик SOAP на стороне клиента], ссылка://WebServices/JAX-WS/JAX-WS-мыло-обработчик-тестирование-на-клиент-и-на стороне сервера/[JAX-WS
: SOAP handler testing for client and server side]
Обработчик SOAP на стороне сервера
В этой статье мы покажем вам, как создать обработчик SOAP и прикрепить его на стороне сервера, чтобы извлечь MAC-адрес в блоке заголовка SOAP из каждого входящего сообщения SOAP. И выполните проверку, чтобы разрешить доступ к этой опубликованной услуге только компьютеру с MAC-адресом « 90-4C-E5-44-B9-8F ».
Если недопустимый клиент пытается получить доступ к сервису, верните клиенту
SOAPFaultException
.
Directory структура этого примера
Изображение://wp-content/uploads/2011/01/jaxws-handler-server-example.png[изображение, название = "JAXWS-обработчик-сервер Пример", ширина = 367, высота = 383]
1. Веб-сервис
Простой веб-сервис с методом
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"; } }
Создайте необходимые файлы Java для развертывания веб-службы.
D:\workspace-new\WebServices\bin>wsgen -keep -verbose -cp . com.mkyong.ws.ServerInfo Note: ap round: 1 ... ком \ mkyong \ WS \ JAXWS \ GetServerName.java ком \ mkyong \ WS \ JAXWS \ GetServerNameResponse.java Примечание: ap раунд: 2
Два файла генерируются:
, ком \ mkyong \ WS \ JAXWS \ GetServerName.java , ком \ 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; @XmlRootElement (name = "getServerNameResponse", namespace = "http://ws.mkyong.com/") @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "getServerNameResponse", namespace = "http://ws.mky) .com/") открытый класс GetServerNameResponse { @XmlElement (name = "return", namespace = "") private 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; импорт java.io.IOException; импорт 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 ("Сервер: handleMessage () ......"); Boolean isRequest = (Boolean) 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) {System.out.println ("Сервер: закрыть () ......"); } @Override public Set <QName> getHeaders () {System.out.println ("Сервер: getHeaders () ......"); вернуть ноль; } private void generateSOAPErrMessage (SOAPMessage msg, String reason) {try {SOAPBody soapBody = msg.getSOAPPart (). getEnvelope (). getBody (); SOAPFault soapFault = soapBody.addFault (); soapFault.setFaultString (причина); выдать новое SOAPFaultException (soapFault); } catch (SOAPException e) {}} }
3. XML-файл обработчика SOAP
Создайте XML-файл обработчика SOAP и поместите объявление обработчика SOAP.
File: handler-chain.xml
<? xml version = "1.0" encoding = "UTF-8" standalone = "yes"?> <JavaEE: хендлер-цепи XMLNS: JavaEE = "http://java.sun.com/xml/ns/javaee" XMLNS: XSD = "http://www.w3.org/2001/XMLSchema"> <JavaEE: Обработчик цепь> <JavaEE: обработчик> <JavaEE: обработчик класса> com.mkyong.handler.MacAddressValidatorHandler </JavaEE: обработчик класса> </JavaEE: обработчик> </JavaEE: Обработчик цепь> </JavaEE: хендлер-цепи>
4. Присоедините SOAP-обработчик → Веб-сервис
Чтобы прикрепить вышеуказанный обработчик SOAP к веб-сервису
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") открытый класс ServerInfo { @WebMethod public String getServerName () {return "mkyong server"; } }
5. Издатель веб-службы
Простой веб-сервис издателя для тестирования.
пакет 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)