JAX-WS: обработчик SOAP на стороне сервера

Обработчик 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 .

Related