`
yongguang423
  • 浏览: 110579 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

axis设置和读取Header

    博客分类:
  • SOA
阅读更多

这不一教学示例,但是可以共享我学习中使用简单Axis Handler(有点类似于ASP.NET soap扩展).我写2个程序——一个基于java控制台程序样式的简单Web service客户端和一个Web service。在这个客户端中调用Web service的方法Test(),调用同时添加了一个包含一个用户名和密码的SOAP header。这个Web service拥有一个简单的Handler,在部署描述符中定义为一个request Handler, 检查每个请求并且保证用户名和密码正确地存在于SOAP header中。当Web service方法获得它的时候,这个Handler也设置有效用户名在ThreadLocal variable中。如果请求没有包含正确的SOAP header,用户名及密码,那么将不能够连接Web service。

Handler类可以通过几种方式设置数据并被Web service的方法获取,其中我知道的一种方法是使用ThreadLocals,虽然它备受争议,但是我认为它可能在这种特殊情况里有用。

我使用的Axis版本是使1.3,我不认为您也是使用这个版本。注意这是测试码,不为产品测试。如果您在代码里发现某些事情有错误,我非常希望您能告诉我。另外要注意的是我建立SOAP header和使用XML namespace的方式有点草率。我知道它可以做得更好,但是我的目的是测试那些handler代码:)

注意到这些Web服务的客户端代码是从WSDL自动生成,所以我并不担心怎么在这里贴出代码。

First, the client code:

 

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
分享到:
评论

相关推荐

    基于Axis2的WS构建客户端示例

    Apache Axis2是Java世界中广泛使用的Web服务框架,它提供了高效、灵活且可扩展的服务实现和调用机制。 标题"基于Axis2的WS构建客户端示例"意味着我们要学习如何使用Axis2来创建一个能够与Web服务交互的客户端应用...

    Axis1.4如何实现头部鉴权

    接着,从Header中获取鉴权令牌和其他必要的鉴权信息,并进行进一步的检查。最后,通过`validate`方法实现具体的鉴权逻辑,判断请求是否合法。 ### 总结 通过以上分析,我们可以看出,在Axis1.4中实现头部鉴权主要...

    深入理解axis2-web service产生

    - **消息格式**:SOAP消息由信封(Envelope)、头部(Header)、主体(Body)和错误(Fault)四部分组成。 - **传输协议**:虽然SOAP可以使用多种传输协议,但在实践中,HTTP是最常用的协议之一。 #### Axis2详解 ...

    Axis2开发webservice总结.doc

    在SOAP Header中,通常会设置一系列参数,例如timestamp、sendAddress等,以供服务器端处理业务逻辑。 2. **开发流程** - **开发前的准备**:首先,你需要一个满足最低配置要求的PC,例如Windows 2000 Server SP4...

    在自己的项目中利用axis2+spring发布webservice与客户端调用包括session

    标题中的“在自己的项目中利用axis2+spring发布webservice与客户端调用包括session”指出的是一个关于在实际项目开发中如何使用Axis2和Spring框架来发布Web服务,并且涉及了Web服务客户端调用以及会话(session)...

    axis开发webservices.doc

    本文介绍了使用Axis2开发Web服务的基本流程,从获取和部署Axis2到建立自定义Web服务的过程。通过对SOAP请求的解析和响应的生成,我们可以实现对特定数据的处理。此外,通过直接操作系统目录级的方式,可以更加灵活地...

    axis开发webservices

    使用Axis2开发Web服务涉及到下载和部署Axis2,创建和配置服务类,以及处理SOAP请求和响应。本文档提供了从零开始构建Web服务所需的全部信息,包括代码示例和构建流程,对于希望利用Axis2开发SOAP Web服务的开发者而...

    webservice for axis客户端详尽代码

    3. 掌握如何设置SOAP消息,包括设置SOAP Header(如果有的话)和SOAP Body中的参数。 4. 学习如何处理异常,因为在调用Web服务时可能会遇到网络问题或其他错误。 5. 最后,实践是检验理解的最佳方式。通过实际运行...

    Axis2快速构建Web Service ppt

    SOAP消息通常包括Envelope、Header和Body三个部分,其中Body部分包含了实际的业务数据。 - **UDDI**:UDDI是一个规范,允许Web Service的注册、发布和查找。它提供了一个目录服务,使得服务消费者可以发现并连接到...

    Axis_API实例教程打包

    2. Axis入门:介绍如何安装和设置Axis环境,以及创建第一个Web服务的步骤。 3. WSDL编写:教授如何手动或使用工具生成WSDL文件,以描述Web服务的接口和绑定。 4. SOAP消息结构:深入解析SOAP消息的构成,包括Header...

    axis2_WebService_开发指南.docx

    开始使用Axis2之前,需要下载相关的JAR包,这些可以从Apache官网获取(http://axis.apache.org/axis2/java/core/download.cgi)。同时,推荐安装官方提供的Eclipse插件,如Service Archive Wizard和Code Generator ...

    JAVA解析soapheader

    JAVA 解析 SOAP Header 在 Java 中,SOAP Header 是一种重要的数据...SOAP Header 是一种重要的数据结构,在 Java 中,我们可以使用 Apache Axis 库来解析和创建 SOAP Header,从而实现 Web 服务编程中的数据传输。

    matlab 读取segy工具包

    4. **数据解析**:读取SEGY文件后,用户可以通过访问结构体数组的不同字段来获取所需的元数据,例如,`tr.header`可以获取每个地震道的头部信息,`tr.data`则对应地震道的数据样本。 5. **可视化**:Matlab的强大...

    axsi2 发送 SOAP报文

    - 创建SOAP消息:首先,你需要创建一个符合SOAP规范的消息结构,包括Header和Body部分。 - 初始化服务客户端:使用Axis2的配置来初始化服务客户端,这通常通过读取服务描述(WSDL)完成。 - 设置回调处理程序:...

    将txt文件读取画图.rar_matlab 画图_matlab 读取文件_matlab画图_matlab读取txt_matla

    例如,`xlabel('X-axis Label')`, `ylabel('Y-axis Label')`, `title('Graph Title')`分别用于设置x轴、y轴和图的标题。 6. **保存和导出图形**:完成绘图后,可以使用`saveas`函数将图形保存为图像文件,如`.jpg`,...

    用MATLAB读取MIT-BIH

    MATLAB作为一款强大的数值计算和数据分析软件,提供了丰富的工具箱,如Signal Processing Toolbox,使得读取和分析心电图数据变得简单高效。以下是使用MATLAB读取MIT-BIH数据库的基本步骤和相关知识点: 1. **数据...

    按行读取TXT_按行读取txt_

    `pandas`的`read_csv()`函数可以读取txt文件,并通过设置`sep`参数处理不同类型的分隔符。`apply()`函数允许对DataFrame的每一行或每一列应用自定义函数。 总的来说,按行读取TXT文件是数据处理中的基本技能,无论...

    off 文件数据读取

    解析文件时,需要根据文件头和数字信息来判断当前读取到的数据类型。例如,当读取到连续的数值时,这些可能是顶点的坐标;而当遇到两个或三个数值时,它们可能是边或面的顶点索引。 以下是一个简单的MATLAB M文件...

    matlab读取地震segy数据.rar

    本教程将详细介绍如何使用MATLAB来读取和处理这种格式的地震数据。 首先,SEGY文件包含了地震采集过程中的原始数据,如时间序列、地理位置信息以及元数据。这些数据对于分析地下地质结构、寻找石油和天然气储藏至关...

    在Web Services中管理Sessions

    这通常涉及到设置和读取HTTP Cookies。在Axis框架中,可以通过`MessageContext`类来获取和操作Session。例如,调用`MessageContext.getSession()`方法来获取Session对象,并使用`Session.get()`和`Session.set()`来...

Global site tag (gtag.js) - Google Analytics