2010-07-02 4 views
9

Sto cercando di aggiungere un'intestazione HTTP personalizzata alla risposta in Apache CXF. Devo contare MD5 dal contenuto e aggiungerlo come intestazione HTTP. Ho provato a usare ResponseHandler o Interceptor. Il mio ultimo tentativo è statoCome aggiungere intestazione HTTP personalizzata alla risposta JAX-RS?

@Component 
public class ResponseBPAuthFilter extends AbstractOutDatabindingInterceptor { 


    public ResponseBPAuthFilter() { 
     super(Phase.MARSHAL_ENDING); 
    } 


    @Override 
    public void handleMessage(Message t) throws Fault { 

     Map headers = CastUtils.cast((Map)t.get(Message.PROTOCOL_HEADERS)); 
     headers.put("Some-Header", Arrays.asList("test")); 

    } 

} 

ma non fa nulla.

risposta

11

tenta di aggiungere Response Object come valore di ritorno in cui è possibile impostare intestazioni ..

Response.ok(/* some entity */).header("CustomHeader", "CustomValue").build(); 

Non è necessario utilizzare intercettori

-1

Controlla CustomOutInterceptor.java nella cartella src/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ da cxf-2.3.3 distribuzione di origine per una dimostrazione funzionante:

import javax.ws.rs.core.MultivaluedMap; 

import org.apache.cxf.interceptor.Fault; 
import org.apache.cxf.jaxrs.impl.MetadataMap; 
import org.apache.cxf.message.Message; 
import org.apache.cxf.phase.AbstractPhaseInterceptor; 
import org.apache.cxf.phase.Phase; 

public class MyOutInterceptor extends AbstractPhaseInterceptor<Message> { 

    public MyOutInterceptor() { 
     super(Phase.MARSHAL); 
    } 

    public void handleMessage(Message message) throws Fault { 
     MultivaluedMap<String, Object> headers = new MetadataMap<String, Object>(); 
     headers.putSingle("BookId", "123"); 
     message.put(Message.PROTOCOL_HEADERS, headers); 
    } 
} 

Immagino che il codice che hai postato come ultimo tentativo sia preso da 1. Ho provato anche questo, non ho potuto farlo funzionare ...

6

Sembra che sia possibile farlo utilizzando CXF CachedOutputStream.

public class MD5OutInterceptor extends AbstractPhaseInterceptor<Message> { 

    public MD5OutInterceptor() { 
     super(Phase.MARSHAL); 
    } 

    public final void handleMessage(Message message) { 


     OutputStream os = message.getContent(OutputStream.class); 
     if (os == null) { 
      return; 
     } 

     final CachedOutputStream cos = new CachedOutputStream(os); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     cos.writeCacheTo(baos); 

     // calculate MD5 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] mdBytes = md.digest(baos); 

     MultivaluedMap<String, Object> headers = (MetadataMap<String, Object>) message.get(Message.PROTOCOL_HEADERS); 

     if (headers == null) { 
      headers = new MetadataMap<String, Object>(); 
     }    

     headers.add("MD5-Header", new String(mdBytes)); 
     message.put(Message.PROTOCOL_HEADERS, headers); 
    } 
} 

Non dimenticare di configurare l'intercettore nel file di configurazione CXF:

<jaxrs:server> 
    <jaxrs:outInterceptors> 
     <ref bean="md5OutInterceptor"> 
    </jaxrs:outInterceptors> 
</jaxrs:server> 

<bean id="md5OutInterceptor" class="com.whatever.MD5OutInterceptor" />