2010-10-20 5 views
6

Come posso accedere alle intestazioni HTTP nell'endpoint di Spring-ws?Come accedere alle intestazioni HTTP nell'endpoint di Spring-ws?

Il mio codice è simile al seguente:

public class MyEndpoint extends AbstractMarshallingPayloadEndpoint { 
    protected Object invokeInternal(Object arg) throws Exception { 
     MyReq request = (MyReq) arg; 
     // need to access some HTTP headers here 
     return createMyResp(); 
    } 
} 

invokeInternal() ottiene solo l'oggetto JAXB deserializzati come parametro. Come posso accedere alle intestazioni HTTP fornite con la richiesta all'interno di invokeInternal()?

Un modo che probabilmente lavorare è quello di creare un filtro servlet che memorizza i valori di intestazione per ThreadLocal variabile che è quindi accessibile all'interno invokeInternal(), ma c'è un altro modo più bello primaverile per fare questo?

risposta

12

È possibile aggiungere questi metodi. Lo TransportContextHolder conserverà alcuni dati relativi al trasporto (HTTP in questo caso) in una variabile locale del thread. È possibile accedere a HttpServletRequest dal TransportContext.

protected HttpServletRequest getHttpServletRequest() { 
    TransportContext ctx = TransportContextHolder.getTransportContext(); 
    return (null != ctx) ? ((HttpServletConnection) ctx.getConnection()).getHttpServletRequest() : null; 
} 

protected String getHttpHeaderValue(final String headerName) { 
    HttpServletRequest httpServletRequest = getHttpServletRequest(); 
    return (null != httpServletRequest) ? httpServletRequest.getHeader(headerName) : null; 
} 
1

Ho avuto lo stesso tipo di problema (vedere questo other question). Avevo bisogno di aggiungere un'intestazione Content-Type al mio WS. Sono andato alla strada del filtro servlet. Nella maggior parte dei casi, non è necessario modificare le intestazioni HTTP in un servizio web. Ma ... c'è qualche volta una differenza tra teoria e pratica.