In questo articolo vedremo come poter intercettare le richieste di servizio per effettuare le operazioni prima e dopo l'esecuzione dell'endpoint.
Fondamentale l'interceptor ci permette di:
- loggare le richieste e le risposte inviate
- applicare dei meccanismi di sicurezza alle richieste pervenute
- gestire i fault di sistema
Per definire un interceptor occorre implementare l'interfaccia EndpointInterceptot che presenta i seguenti metodi:
- handleRequest
- handleResponse
- handleFault
Il metodo handleRequest viene invocato prima dell'esecuzione dell'endpoint e il suo utilizzo principale è quello di bloccare l'esecuzione di un servizio.
Il metodo handleResponse viene invocato dopo l'esecuzione dell'endpoint e il sul utilizzo principale è quello di elaborare la risposta, magari aggiungendo attributi.
Il metodo handleFault viene invocato dopo l'esecuzione di un fault con finalità analoghe a quelle del metodo handleResponse.
Per chi non avesse particolari esigenze Spring offre già alcune implementazioni di interceptor:
- PayloadLoggingInterceptor
- PayloadValidatingInterceptor
- PayloadTransformingInterceptor
Il PayloadLoggingInterceptor permette di loggare le richieste e le risposte.
Il PayloadValidatingInterceptor valida le richieste e le risposte in base ad uno schema xsd indicato nelle sue properties.
Il PayloadTransformingInterceptor effettua una transformazione delle richieste e delle risposte basate su XSLT. Viene usato quando il server gestisce più versioni dello stesso servizio.
Nel nostro progetto applichiamo un logger delle richieste e delle risposte e un validatore, ottenendo una configurazione di questo tipo.
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
<property name="mappings">
<props>
<prop key="{http://www.example.org/schema}RicercaLibroRequest">ricercaLibroEndpoint</prop>
</props>
</property>
<property name="interceptors">
<list>
<ref bean="loggingInterceptor"/>
<ref bean="validatingInterceptor"/>
</list>
</property>
</bean>
<bean id="loggingInterceptor"
class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/>
<bean id="validatingInterceptor"
class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
<property name="schema" value="classpath:schema.xsd"/>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
Prossimo