2013-02-05 11 views
9

Utilizzo Netbeans per creare automaticamente client Webservice basati su file WSDL. Funziona bene, ad eccezione dei servizi Web che sto usando che richiedono il passaggio di un cookie personalizzato nell'intestazione HTTP a ogni webservice per provare la mia identità.Client JAX-WS: mantenimento di sessione/cookie su più servizi

Per ottenere la mia autorizzazione, utilizzo un servizio web denominato Utility. Questo imposta un cookie che deve essere fornito in tutte le chiamate successive a qualsiasi servizio web.

Questo può essere eseguito impostando javax.xml.ws.session.maintain su true sul BindingProvider della porta per il servizio web. Funziona perfettamente per le chiamate successive ai metodi nel servizio web Utility. Il problema è che questo mantiene solo la sessione/cookie per quel singolo webservice. Ne ho bisogno anche per gli altri.

Ho bisogno che il cookie sia passato a un separato webservice chiamato History Come posso realizzare questo? È possibile avere una classe di super servizio che sia Utility che History potrebbero estendere e condividere lo stesso stato di sessione con?

risposta

14

Ho trovato una soluzione.

È possibile ottenere le intestazioni di risposta utilizzando questo dopo aver effettuato la chiamata:

((BindingProvider)port).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS); 

Trova l'intestazione Set-Cookie e memorizzare il suo valore.

Poi prima della richiesta successiva (in qualsiasi webservice) è possibile impostare l'intestazione Cookie:

((BindingProvider)port).getRequestContext().put(
      MessageContext.HTTP_REQUEST_HEADERS, 
       Collections.singletonMap("Cookie", Collections.singletonList(cookieValue) 
      ) 
     ); 
+0

Forse si deve aggiungere che l'estrazione del cookie in questo modo è possibile solo direttamente dopo la prima chiamata - poiché solo lì "Set-Cookie" è impostato. Ma comunque ... grazie mille. Questo mi ha fatto risparmiare molto tempo. – cljk

3

Proprio commentando quanto soluzione di cui sopra non ha funzionato per me. Ho ottenuto UnsupportedOperationException. Credo che il problema sia stato causato dal fatto che SingletonMap non consente modifiche. erano necessari anche gli header xml, quindi li ho impostati per primi.

Map<String, List<String>> headers= CastUtils.cast((Map)port.getRequestContext().get("javax.xml.ws.http.request.headers")); 
if (headers == null) { 
    headers = new HashMap<String, List<String>>(); 
    port.getRequestContext().put("javax.xml.ws.http.request.headers", headers); 
} 

headers.put("Cookie", Collections.singletonList(cookieValue)); 
((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
+0

Sì, SingletonMaps è immutabile - l'ho usato solo per comodità – bradvido

+1

Dovresti rivedere il codice per renderlo più compatto, conoscendo MessageContext.HTTP_REQUEST_HEADERS == "javax.xml.ws.http.request.headers" –

+0

La sua versione è in realtà uno più corto, includendo anche le virgolette, ma so cosa intendi. Utilizzare una costante è sicuramente più sicuro. :) – Martin

Problemi correlati