【问题标题】:How to add custom HTTP Header to JAX-RS response?如何将自定义 HTTP 标头添加到 JAX-RS 响应?
【发布时间】:2010-07-02 12:32:13
【问题描述】:

我正在尝试将自定义 HTTP 标头添加到 Apache CXF 中的响应中。我需要从内容中计算 MD5 并将其添加为 HTTP 标头。我尝试使用 ResponseHandler 或 Interceptor。我最后一次尝试是

@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"));

   }

}

但它什么也没做。

【问题讨论】:

    标签: apache cxf jax-rs


    【解决方案1】:

    尝试添加 Response Object 作为返回值,您可以在其中设置 Headers..

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

    你不需要使用拦截器

    【讨论】:

      【解决方案2】:

      听起来您可以使用 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);
          }
      }
      

      不要忘记在 cxf 配置文件中配置你的拦截器:

      <jaxrs:server>
          <jaxrs:outInterceptors>
              <ref bean="md5OutInterceptor">
          </jaxrs:outInterceptors>
      </jaxrs:server>
      
      <bean id="md5OutInterceptor" class="com.whatever.MD5OutInterceptor" />
      

      【讨论】:

        【解决方案3】:

        检查 src/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ 文件夹中的 CustomOutInterceptor.java 来自 cxf-2.3.3 源代码分发的工作演示:

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

        我猜您上次尝试发布的代码取自1。也在尝试这个,也无法让它工作......

        【讨论】:

          猜你喜欢
          • 2012-10-27
          • 2014-05-25
          • 1970-01-01
          • 2011-07-23
          • 2015-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多