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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<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> |