将自定义HTTP标头添加到Axis 1.4 Web服务响应中

时间:2013-09-13 13:21:31

标签: java web-services axis jax-rpc

我正在尝试向Axis 1.4 Web服务器添加自定义HTTP标头。

我创建了一个扩展BasicHandler的处理程序:

public class HttpHeaderHandler extends BasicHandler {

  .
  .
  .

  @Override
  public void invoke(org.apache.axis.MessageContext arg0) throws AxisFault {  
    LOG.trace("invoke called");     
    Hashtable ht = (Hashtable)ctx.getProperty(HTTPConstants.RESPONSE_HEADERS);
    if(ht == null) {
      ht = new Hashtable();
    }
    ht.put("custom-header", "Hello");
    ctx.setProperty(HTTPConstants.RESPONSE_HEADERS, ht);     
  }

  .
  .
  .

}

我已将以下内容添加到server-config.wsdd:

    .
    .
    .

<transport name="http">
    <requestFlow>
        <handler type="URLMapper" />
        <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
    </requestFlow>
    <responseFlow>
        <handler type="java:com.my.package.HttpHeaderHandler" />
    </responseFlow>
</transport>

    .
    .
    .

我可以看到正在调用invoke方法,因为日志文件出现在日志文件中,但自定义标头没有添加到响应中。

任何建议表示赞赏。

4 个答案:

答案 0 :(得分:1)

我记得使用生成的存根文件添加HTTP用户和密码,检查此链接并找到说明的代码:

_call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);  

http://www.coderanch.com/t/225102/Web-Services/java/Axis-username-password-auth-stubs

这种修改有效。

答案 1 :(得分:1)

我可以通过执行以下操作在org.apache.axis.Stub实例上执行此操作:

private Stub setHeaders(Stub stub, Hashtable<String, String> headers){
    stub._setProperty(HTTPConstants.REQUEST_HEADERS, headers);
    return stub;
}

请注意,_setProperty()的value参数必须是java.util.Hashtable(当使用Stub时,它会被Axis稍后转换)

答案 2 :(得分:1)

我为请求头添加了 apikey 感谢@romeara 回答 here 。它有效。 Axis 1.4 从 java 发送客户端请求。

YourStub stub = new YourStub();
Hashtable<String, String> headers = new Hashtable<String, String>();
headers.put("apikey", "xxxxxxxxxxxxxxxxxxxx");
stub._setProperty(HTTPConstants.REQUEST_HEADERS, headers);

答案 3 :(得分:0)

这就是我们所做的

import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;

 /**
 * This method is to be used for secure SOAP calls.
 * Method created as Axis 1.4 strips the security header which compiling the Java classes.
 * @param username
 * @param password
 * @return SOAP Header
 * @throws SOAPException
 */
public static SOAPHeaderElement createCustomSOAPHeader(String username, String password) throws SOAPException {
    SOAPHeaderElement oHeaderElement;
    SOAPElement oElement;   

    //Header
    oHeaderElement = new SOAPHeaderElement("http://siebel.com/webservices", "Security");
    oHeaderElement.setPrefix("web");
    oHeaderElement.setMustUnderstand(false);
    //Elements for the Header
    oElement = oHeaderElement.addChildElement("UsernameToken");
    oElement.addTextNode(username);
    oElement = oHeaderElement.addChildElement("PasswordText");
    oElement.addTextNode(password);
    oElement = oHeaderElement.addChildElement("SessionType");
    oElement.addTextNode("None");

    return oHeaderElement;
}

希望这有帮助。