1. Vad är en SOAP handler?
En SOAP handler är en konstruktion som gör det möjligt att läsa och skriva till det råa SOAP-meddelandet som skickas eller tas emot. Varför vill man göra detta? Är det inte bra att JAX-RPC tillhandahåller stubbar som döljer protokoll som SOAP, HTTP o.s.v.? Beskrivningen av en SOAP-handler ligger utanför WSDL-filen, och tillför typiskt sådan funktionalitet som inte beskrivs i WSDL-filen. Vi har två sorters funktionalitet, den första är serverspecifika funktioner, som t.ex:
- Loggning: Man kan logga det råa SOAP-meddelandet innan det översätts till ett Java-anrop.
- Cachning: Ibland vill använda handler för att lägga/hämta data ur någon cache.
Denna typ av funktioner ställer inga krav på klienten och är därför relativt ofarlig att utnyttja. Den anra sortens funktionalitet är sådan som innebär att även klienten måste ändra på SOAP-meddelandet för att tjänsten ska fungera. Oftast innebär detta att man lägger till eller läser element i SOAP-huvudet. Nedan ges några exempel på funktionalitet som kan tänkas vara intressant:
- Digital signatur: Man kan signera SOAP-meddelandet genom att lägga till en digital signatur i SOAP-huvudet (se WSS 1.0 för exempel). En digital signatur bevisar att meddelandet inte har manipulerats.
- Kryptering: Man kan kryptera eller avkryptera SOAP-meddelandet. OBS: Detta kan bara ske till viss utsträckning eftersom behållaren måste kunna identifiera meddelandet till den grad att man vet vilken tjänst (och därmed vilken SOAP handler) som ska avkryptera det.
- Koordination: Man kan lägga till instruktioner i SOAP-huvudet för koordination av webbtjänster.
- Livscykeln: handlerns livscykel kontrolleras av behållaren, d.v.s. behållaren kontrollerar när en handler instansieras och förstörs.
- Tillståndslös: Specifikationen säger att handlern är tillståndslös Eftersom handlerns livscykel kontrolleras av behållaren, d.v.s. behållaren kontrollerar när en handler instansieras och förstörs.
Eftersom funktionalitet som utförs av SOAP handler inte definieras i WSDL-filen är det viktigt att klient och server hittar ett annat sätt att överföra information om vilka element som får finnas alternativt måste finnas i SOAP-huvudet. Detta ställer högre krav på kommunikationen mellan klient och server.
2. Översikt
Nedan listas några punkter om handler som är bra att känna till:
- handler finns bara för SOAP: JAX-RPC 1.1 definierar bara handler-funktionalitet bara för SOAP-protokollet.
- Oberoende av transport: handler är oberoende av transportprotokoll. Om en annan transport än HTTP används (t.ex. JMS) för att överföra SOAP-meddelandet kommer handlern ej att påverkas.
- Specifik för tjänsten: En handler knyts till en specifik tjänst i deployment descriptorn. Du gör detta genom att lägga in ett <handler>-element under <port-component>-elementet.
- Kan inte ändra den anropade operationen: En handler kan inte rikta om SOAP-meddelandet till en annan tjänst eller till en annan operation. handlern kan heller inte ändra typerna på operationernas meddelanden (inparametrarna till metoden). Det enda en handler kan göra är att ändra i MessageContext-objektet.
- Livscykel: En handlers livscykel kontrolleras av behållaren (Web eller EJB), d.v.s. behållaren bestämmer när handlern ska initieras och förstöras.
- Tillståndslös: En handler är tillståndslös, det är alltså förbjudet att lagra tillstånd mellan olika anrop.