首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

axis设立和读取Header

2012-11-09 
axis设置和读取Headerpackage testimport org.apache.axis.message.*public class MyClient { public st

axis设置和读取Header
package test;import org.apache.axis.message.*;public class MyClient { public static void main(String[] args) { System.out.println("Hello, this is the client!"); MyServiceServiceLocator wsloc = new MyServiceServiceLocator(); SOAPHeaderElement oHeaderElement; javax.xml.soap.SOAPElement oElement; MyServiceSoapBindingStub ws; try { ws = (MyServiceSoapBindingStub)wsloc.getMyService(); oHeaderElement = new SOAPHeaderElement("http://test", "securityHeader"); oHeaderElement.setPrefix("sec"); oHeaderElement.setMustUnderstand(false); oElement = oHeaderElement.addChildElement("username"); oElement.addTextNode("johan"); oElement = oHeaderElement.addChildElement("password"); oElement.addTextNode("secret"); ws.setHeader(oHeaderElement); System.out.println(ws.test()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}

?


Then, the web service code (most comments and javadoc removed):

package test.service;import test.service.handler.MyHandler;public class MyService { public String test() {  String username = MyHandler.getUsername();  MyHandler.setUsername(null); //clean up    return "Hello from Service! User is = " + username; }} 
?

Finally, the Handler code looks something like this:

package test.service.handler;import org.apache.axis.AxisFault;import org.apache.axis.Message;import org.apache.axis.MessageContext;import org.apache.axis.handlers.BasicHandler;import java.util.Iterator;import javax.xml.soap.SOAPException;import javax.xml.soap.SOAPHeader;import javax.xml.soap.SOAPHeaderElement;import org.apache.axis.message.SOAPEnvelope;/** * Simple Axis handler which looks for a SOAP header * containing two elements - username and password. Invoke() method  * checks these *  * @author Johan Danforth */public class MyHandler extends BasicHandler { private static final long serialVersionUID = 1L; private static ThreadLocal _username = new ThreadLocal();    public static String getUsername() {        return ((String) (_username.get())).toString();    }        public static void setUsername(String value) {        _username.set(value);    }  /**  * Method called by Axis handler, checks SOAP header with   * username and password.  *   * @throws AxisFault if header is missing or invalid or wrong username or password  */ public void invoke(MessageContext msgContext) throws AxisFault {  boolean processedHeader = false;    try {   Message msg = msgContext.getRequestMessage();   SOAPEnvelope envelope = msg.getSOAPEnvelope();   SOAPHeader header = envelope.getHeader();   Iterator it = header.examineAllHeaderElements();   SOAPHeaderElement hel;      while (it.hasNext()) {    hel = (SOAPHeaderElement) it.next();    String headerName = hel.getNodeName();    if(headerName.equals("sec:securityHeader"))    {     checkUsername(hel);     processedHeader = true;    }   }  } catch (SOAPException e) {   //capture and wrap any exception.    throw new AxisFault("Failed to retrieve the SOAP Header or it's details properly.", e);  }  if(!processedHeader)   throw new AxisFault("Failed to retrieve the SOAP Header");   } private void checkUsername(SOAPHeaderElement hel) throws AxisFault {  String username = getUsername(hel);  String password = getPassword(hel);    if(!(username.equals("johan") && password.equals("secret")))  {   throw new AxisFault("Access Denied");  }  else  {   //set username as threadlocal variable   _username.set(username);  } } private String getPassword(SOAPHeaderElement hel) throws AxisFault {  org.w3c.dom.Node passwordNode = hel.getLastChild();  String nodename = passwordNode.getNodeName();   if(!nodename.equals("sec:password"))   throw new AxisFault("Missing password element in SOAP header.");  String password = passwordNode.getFirstChild().getNodeValue();  System.out.println("password = " + password);  return password; } private String getUsername(SOAPHeaderElement hel) throws AxisFault {  org.w3c.dom.Node usernameNode = hel.getFirstChild();  String nodename = usernameNode.getNodeName();   if(!nodename.equals("sec:username"))   throw new AxisFault("Missing username element in SOAP header.");  String username = usernameNode.getFirstChild().getNodeValue();  System.out.println("username = " + username);  return username; }} 
?
我必须贴出部署描述和Web.xml的内容。我在同一个Web应用程序中运行Axis Servlets。它有助于您在实际情况中使用您更喜欢的方式。我认为当我使用Eclipse的最新的版本时,这种方法更容易使用。在web.xml中充满Axis资源的原因是我使用单独的server-config.wsdd来代替通过Axis管理工具注册服务来指示一个单独的deploy.wsdd文件。我也附上一个deploy.wsdd文件示例,以防万一有人不熟悉服务器配置文件。

My web.xml looks like this:

<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name> HelloWorld2</display-name> <servlet>  <display-name>  Apache-Axis Servlet</display-name>  <servlet-name>AxisServlet</servlet-name>  <servlet-class>  org.apache.axis.transport.http.AxisServlet</servlet-class> </servlet> <servlet>  <display-name>  Axis Admin Servlet</display-name>  <servlet-name>AdminServlet</servlet-name>  <servlet-class>  org.apache.axis.transport.http.AdminServlet</servlet-class>  <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping>  <servlet-name>AxisServlet</servlet-name>  <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping>  <servlet-name>AxisServlet</servlet-name>  <url-pattern>*.jws</url-pattern> </servlet-mapping> <servlet-mapping>  <servlet-name>AxisServlet</servlet-name>  <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet-mapping>  <servlet-name>AdminServlet</servlet-name>  <url-pattern>/servlet/AdminServlet</url-pattern> </servlet-mapping> <welcome-file-list>  <welcome-file>index.html</welcome-file>  <welcome-file>index.htm</welcome-file>  <welcome-file>index.jsp</welcome-file>  <welcome-file>default.html</welcome-file>  <welcome-file>default.htm</welcome-file>  <welcome-file>default.jsp</welcome-file> </welcome-file-list></web-app> 
?
My server-config.wsdd looks like this:
<?xml version="1.0" encoding="UTF-8"?><deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalConfiguration>  <parameter name="sendMultiRefs" value="true"/>  <parameter name="disablePrettyXML" value="true"/>  <parameter name="adminPassword" value="admin"/>  <parameter name="attachments.Directory" value="C:\Java\eclipse\workspace\HelloWorld2\.deployables\HelloWorld2\WEB-INF\attachments"/>  <parameter name="dotNetSoapEncFix" value="true"/>  <parameter name="enableNamespacePrefixOptimization" value="true"/>  <parameter name="sendXMLDeclaration" value="true"/>  <parameter name="sendXsiTypes" value="true"/>  <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>  <requestFlow>   <handler type="java:org.apache.axis.handlers.JWSHandler">    <parameter name="scope" value="session"/>   </handler>   <handler type="java:org.apache.axis.handlers.JWSHandler">    <parameter name="scope" value="request"/>    <parameter name="extension" value=".jwr"/>   </handler>  </requestFlow> </globalConfiguration> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <service name="AdminService" provider="java:MSG">  <parameter name="allowedMethods" value="AdminService"/>  <parameter name="enableRemoteAdmin" value="true"/>  <parameter name="className" value="org.apache.axis.utils.Admin"/>  <namespace>http://xml.apache.org/axis/wsdd/</namespace> </service> <service name="Version" provider="java:RPC">  <parameter name="allowedMethods" value="getVersion"/>  <parameter name="className" value="org.apache.axis.Version"/> </service> <service name="MyService" provider="java:RPC" style="wrapped" use="literal">  <operation name="test" qname="ns3:test" returnQName="ns3:testReturn" returnType="xsd:string" soapAction="" xmlns:ns3="http://test" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>  <parameter name="allowedMethods" value="test"/>  <requestFlow>   <handler type="java:test.service.handler.MyHandler">    </handler>  </requestFlow>  <parameter name="typeMappingVersion" value="1.2"/>  <parameter name="wsdlPortType" value="MyService"/>  <parameter name="className" value="test.service.MyService"/>  <parameter name="wsdlServicePort" value="MyService"/>  <parameter name="schemaQualified" value="http://test"/>  <parameter name="wsdlTargetNamespace" value="http://test"/>  <parameter name="wsdlServiceElement" value="MyServiceService"/> </service> <transport name="http">  <requestFlow>   <handler type="URLMapper"/>   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>  </requestFlow>  <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>  <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>  <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>  <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>  <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>  <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/> </transport> <transport name="local">  <responseFlow>   <handler type="LocalResponder"/>  </responseFlow> </transport></deployment>
??
A sample deploy.wsdd could look like this:
<?xml version="1.0" encoding="UTF-8"?><!-- Use this file to deploy some handlers/chains and services      --><!-- Two ways to do this:                                           --><!--   java org.apache.axis.client.AdminClient deploy.wsdd          --><!--      after the axis server is running                          --><!-- or                                                             --><!--   java org.apache.axis.utils.Admin client|server deploy.wsdd   --><!--      from the same directory that the Axis engine runs         --><deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  <service name="MyService" provider="java:RPC" style="wrapped" use="literal">      <parameter name="wsdlTargetNamespace" value="http://test"/>      <parameter name="wsdlServiceElement" value="MyServiceService"/>      <parameter name="schemaQualified" value="http://test"/>      <parameter name="wsdlServicePort" value="MyService"/>      <parameter name="className" value="test.service.MyService"/>      <parameter name="wsdlPortType" value="MyService"/>      <parameter name="typeMappingVersion" value="1.2"/>      <operation xmlns:operNS="http://test" xmlns:retNS="http://test" xmlns:rtns="http://www.w3.org/2001/XMLSchema" name="test" qname="operNS:test" returnQName="retNS:testReturn" returnType="rtns:string" soapAction="">      </operation>      <parameter name="allowedMethods" value="test"/>  <requestFlow>   <handler type="java:test.service.handler.MyHandler">    </handler>  </requestFlow>  </service></deployment>
?转自:http://www.cnblogs.com/liguiqing/archive/2007/10/22/933585.html

热点排行