2010-07-02 38 views
9

Tôi đang cố gắng thêm tiêu đề HTTP tùy chỉnh để phản hồi trong Apache CXF. Tôi cần phải đếm MD5 từ nội dung và thêm nó như là một tiêu đề HTTP. Tôi đã cố gắng sử dụng ResponseHandler hoặc Interceptor. Lần thử cuối cùng của tôi làCách thêm tiêu đề HTTP tùy chỉnh vào phản hồi 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")); 

    } 

} 

nhưng không có gì.

Trả lời

11

Cố gắng thêm Response Object như giá trị trả về của bạn, nơi bạn có thể đặt Headers ..

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

Bạn không cần phải sử dụng tên lửa đánh chặn

-1

Kiểm tra CustomOutInterceptor.java trong thư mục src/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ từ phân phối nguồn cxf-2.3.3 để có bản trình diễn làm việc:

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); 
    } 
} 

Tôi đoán mã bạn đã đăng là nỗ lực cuối cùng của bạn được lấy từ 1. Cũng đã cố gắng điều này, không thể làm cho nó hoạt động ...

6

Có vẻ như bạn có thể thực hiện điều này bằng cách sử dụng 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); 
    } 
} 

Đừng quên để cấu hình đánh chặn của bạn trong file cấu hình CXF:

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

<bean id="md5OutInterceptor" class="com.whatever.MD5OutInterceptor" /> 
Các vấn đề liên quan