1.webservice传递javabean

  自定义javabean必须是可序列化的

  如果javabean中有内部类必须是静态的,因为只有静态的类才可以序列化

  如果javabean中用到了其他的javabean,也必须在server-config.wsdd文件中进行映射声明

  1.1 服务器端搭建

    1)创建java类并进行编译

package com.beifeng.hadoop.webservice.server;

import java.io.Serializable;

public class Order implements Serializable{

    private static final long serialVersionUID = 1L;

    private int orderId;
private String orderName;
。。。之后的get和set方法在此进行省略
}
package com.beifeng.hadoop.webservice.server;

public class OrderWebService {

    public Order getOrder(Order order) {
order.setOrderName("response by server");
return order;
}
}

    2) 将编译后的class文件和包结构拷贝到tomcat/webapps/axis/web-info/classes目录下

    3) 在web-info目录下的server-config.wsdd文件中添加webservice服务

<service name="OrderWebService" provider="java:RPC">
<parameter name="className" value="com.beifeng.hadoop.webservice.server.OrderWebService" />
<parameter name="allowedMethods" value="getOrder" />
     <!--配置实体映射-->
<beanMapping qname="ns1:Order" languageSpecificType="java:com.beifeng.hadoop.webservice.server.Order" xmlns:ns1="urn:BeanService"/>
</service>

    4) 重启tomcat,在浏览器中查看

       

  1.2 客户端调用

    必须在客户端代码中包含此实体,且包结构必须一致

        String url = "http://localhost:8080/axis/services/OrderWebService";

        Service service = new Service();
Call call = (Call) service.createCall(); // 注册javabean对象并添加序列化和反序列化器
QName qn = new QName("urn:BeanService", "Order");
call.registerTypeMapping(Order.class, qn,
new BeanSerializerFactory(Order.class, qn),//序列化工厂类
new BeanDeserializerFactory(Order.class, qn)); //反序列化工厂类 call.setTargetEndpointAddress(url);
call.setOperationName(new QName(url, "getOrder")); //设置传入和返回参数类型
call.addParameter("arg1", qn, ParameterMode.IN);
call.setReturnType(new QName(url, "Order"), Order.class);
Order order = (Order) call.invoke(new Object[] { new Order() }); //服务器返回
System.out.println(order);

2.webservice中的handler使用

  2.1 handler的创建方式:实现Handler接口或者集成BasicHandler

  2.2 handler的作用:类似于web中的Filter

    日志记录,认证和授权等

  2.3.1 handler日志记录实现

    2.3.1.1 服务器端的实现

      1)编写service类和handler类并实现invoke方法,编译拷贝class文件到tomcat

package com.beifeng.hadoop.webservice.server.handler;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Date;
import org.apache.axis.AxisFault;
import org.apache.axis.Handler;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler; public class LogHandler extends BasicHandler {
private static final long serialVersionUID = 1L;
public void invoke(MessageContext msgContext) {
try {
//获取webservice服务
Handler handler=msgContext.getService(); //获取日志文件
String filename=(String) this.getOption("filename");
if (filename==null||filename.equals("")) {
throw new AxisFault("日志文件不存在");
} //创建基础文件输出流
FileOutputStream fileOutputStream=new FileOutputStream(filename,true); //格式化输出流
PrintWriter printWriter=new PrintWriter(fileOutputStream); //获取被访问次数
Integer counter=(Integer) handler.getOption("accesses");
if (counter==null) {
counter=1;
}else {
counter++;
}
//记录日志
printWriter.println("在"+new Date()+msgContext.getTargetService()+"被调用了"+counter+"次");
printWriter.close();
handler.setOption("accesses", counter);
}catch (Exception e) {
e.printStackTrace();
}
}
}

      2)修改server-config.wsdd文件

<service name="HandlerWebService" provider="java:RPC">
<parameter name="className" value="com.beifeng.hadoop.webservice.server.HandlerWebService" />
<parameter name="allowedMethods" value="hello" />
<requestFlow>
<handler name="LogHandler" type="java:com.beifeng.hadoop.webservice.server.handler.LogHandler">
       <!--日志记录文件配置-->
<parameter name="filename" value="/service.log"/>
</handler>
</requestFlow>
</service>

      3)重启tomcat,并允许客户端代码进行调用,查看service.log文件内容

        

    2.3.2 权限认证(判断用户名和密码是否在tomcat/webapps/axis/WEB-INF/users.lst文件中存在)

      2.3.2.1 服务器端开发

        1) 编写handler,并编译拷贝class文件 

package com.beifeng.hadoop.webservice.server.handler;

import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.security.AuthenticatedUser;
import org.apache.axis.security.SecurityProvider;
import org.apache.axis.security.simple.SimpleSecurityProvider; public class AuthenticationHandler extends BasicHandler { private static final long serialVersionUID = 1L; private String securityProvider="securityProvider";//安全服务 private String unanthenticated="unauthenticated";//未认证 private String authenticatedUser="authenticatedUser"; //已认证用户 public void invoke(MessageContext msgContext) throws AxisFault {
//获取当前的安全服务
SecurityProvider provider=(SecurityProvider) msgContext.getProperty(securityProvider);
if (provider==null) {
provider=new SimpleSecurityProvider();
msgContext.setProperty(securityProvider, provider);
} //获取当前的认证信息
//String username=msgContext.getUsername();
//String password=msgContext.getPassword();
//对访问的用户进行认证(查看用户名和密码是否在tomcat/webapps/axis/WEB-INF/users.lst文件中存在)
AuthenticatedUser user=provider.authenticate(msgContext);
if (user==null) {
throw new AxisFault("认证失败");
}
//将已认证的用户添加到msgContext中
msgContext.setProperty(authenticatedUser, user);
}
}

        2)在tomcat/.../server.config.wsdd中添加配置

<service name="HandlerWebService" provider="java:RPC">
<parameter name="className" value="com.beifeng.hadoop.webservice.server.HandlerWebService" />
<parameter name="allowedMethods" value="hello" />
<requestFlow>
     <!--认证handler配置-->
     <handler name="AuthenticationHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthenticationHandler"/>
<handler name="LogHandler" type="java:com.beifeng.hadoop.webservice.server.handler.LogHandler">
       <!--日志记录文件配置-->
<parameter name="filename" value="/service.log"/>
</handler>
</requestFlow>
</service>

    2.3.2.2 客户端调用代码

        需要在call中设置使用的用户名和密码  

String url="http://localhost:8080/axis/services/HandlerWebService";
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(url, "hello")); //设置用户名密码
call.setUsername("user1");
call.setPassword("pass1");
String result=(String) call.invoke(new Object[]{"tom"});

    2.3.3 授权(客户端和认证一样,这里只记录服务端开发)

      1)编写handler

package com.beifeng.hadoop.webservice.server.handler;

import org.apache.axis.AxisFault;
import org.apache.axis.Handler;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.security.AuthenticatedUser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class AuthorityHandler extends BasicHandler {
private static final long serialVersionUID = 1L;
private static Log log=LogFactory.getLog(AuthorityHandler.class);
public void invoke(MessageContext msgContext) throws AxisFault {
//获取认证通过的用户
AuthenticatedUser authenticatedUser=(AuthenticatedUser) msgContext.getProperty("authenticatedUser");
if (authenticatedUser==null) {
throw new AxisFault("用户不能为空!");
} String username=authenticatedUser.getName();
Handler hanlder = msgContext.getService();
//获取配置文件中授权的用户列表字符串
String allowedRoles=(String) hanlder.getOption("allowedRoles");
if (allowedRoles==null) {
log.info("不需要授权");
return;
} String[] roles=allowedRoles.split(",");
for(String role:roles){
if (username.equals(role)) {
log.info("通过授权");
return;
}
}
throw new AxisFault("授权失败");
}
}

      2)修改tomcat/.../server_config.wsdd

<service name="HandlerWebService" provider="java:RPC">
<parameter name="className" value="com.beifeng.hadoop.webservice.server.HandlerWebService" />
<parameter name="allowedMethods" value="hello" />
  <!--授权的用户列表-->
  <parameter name="allowedRoles" value="tom,user1"/>
<requestFlow>
     <!--认证handler配置-->
     <handler name="AuthenticationHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthenticationHandler"/>
     <!--授权handler配置-->
     <handler name="AuthorityHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthorityHandler"/>
<handler name="LogHandler" type="java:com.beifeng.hadoop.webservice.server.handler.LogHandler">
       <!--日志记录文件配置-->
<parameter name="filename" value="/service.log"/>
</handler>
</requestFlow>
</service>

3 handler clain的配置

   <!--认证handler -->
<handler name="AuthenticationHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthenticationHandler"/>
<!--授权handler -->
<handler name="AuthorityHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthorityHandler"/>
<!-- 认证授权链 -->
<chain name="chainHandler">
<handler type="AuthenticationHandler"/>
<handler type="AuthorityHandler"/>
</chain> <!-- chain的使用 -->
<service name="ChainService" provider="java:RPC">
<parameter name="className" value="com.beifeng.hadoop.webservice.server.ChainWebService"/>
<parameter name="allowedMethods" value="*"/>
<requestFlow>
<chain type="chainHandler"/>
</requestFlow>
</service>

webservice的使用-axis1-02的更多相关文章

  1. 根据wsdl的url,使用axis1.4生成客户端,并且对webservice进行调用(转)

    根据wsdl的url,使用axis1.4生成客户端,并且对webservice进行调用 axis1.4下载地址 1.到www.apache.org上去下载axis-bin-1_4.zip,如要关联源代 ...

  2. java webservices 以Axis1.4方式 调用sap webservice接口.

    1. 首先需要下载Axis1.4 jar包,这个必应搜索大把,下载下来后把jar包加入eclipse工程项目路径中即可. 2. 下载mail.jar和activation.jar 俩个包.下载地址:h ...

  3. Webservice接口和Http接口

    WebService又是一种高级应用,与之前学习的Struts.Spring.Hibernate等框架不同.WebService是面向服务的架构(SOA),看起来像是比SSH框架要大.那么它到底是做什 ...

  4. 《转》CXF WebService 开发文档-目录索引

    CXF WebService 开发文档-目录索引 上次介绍了Axis的WebService,现在我们来看看CXF是怎么完成WebService的. Axis1 WebService 在线博文: htt ...

  5. Tomcat6.0+Jdk1.5+Axis1.3搭建java webservice环境,并使用c#调用该服务。

    java jdk:jdk1.5.0_17 下载网址:http://pan.baidu.com/s/1gdmAkgV tomcat 6.0 下载地址:http://tomcat.apache.org/d ...

  6. spring WebServiceTemplate 调用 axis1.4 发布的webservice

     前言: 最近在开发中需要调用对方的 webservice服务,按照现有的技术,本应该是一件很简单的事情,只需要拿到wsdl文件,生成客户端代码即可,但是,对方的webservice服务是06年用ax ...

  7. MyEclipse 搭建webservice (axis1.4)

    0 引言  以前都是做javaweb的 最近因工作需要 接触了webservice 关于什么事webservice,与web的区别,soap,跟http的区别,asix1和asix2的区别,为什么不用 ...

  8. axis1客户端调用webservice的通用代码

    1.axis1 作为web service 客户端时,调用web service 服务端的通用代码 String url = "http://www.webxml.com.cn/webser ...

  9. 使用URLConnection调用axis1.4开发的webservice

    写在前面: 调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可:2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是a ...

  10. 基于axis1.4的webservice实例

    1.准备工作: 概念:SOAP(简单对象访问协议).WSDL(web服务描述语言).XML(可扩展标记语言).axis(阿帕奇可扩展交互系统) (1)     下载axis1.4,将axis1.4中的 ...

随机推荐

  1. vue如何配置路由 、获取路由的参数、部分刷新页面、缓存页面

    vue如何配置路由 .获取路由的参数.部分刷新页面.缓存页面:http://www.mamicode.com/info-detail-1941546.html vue-router传递参数的几种方式: ...

  2. python学习第二天--字符串及格式化输出

    # 字符串# 字符串取值:字符串名[索引值] 只能取单个值# 正序访问,从0开始str1 = "hello world"print(str1[3]) # 输出"l&quo ...

  3. POJ 2417 Discrete Logging ( Baby step giant step )

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3696   Accepted: 1727 ...

  4. 删除文件时提示“找不到该项目”,怎么解决? 转摘自:http://jingyan.baidu.com/article/e4d08ffdf5ab470fd2f60df4.html

    故障现象:在使用Windows系统删除文件或者文件夹的时候,有时会出现“找不到该项目”的错误提示,可能再次“重试”也无济于事. 那么,接下来T库小编就为库友们简单概括一下出现该问题的原因. 故障原因: ...

  5. css 图片有间隔多个Img标签之间的间隙

    今天写css时发现,图片加起来刚好是900px的三张图片,不能在一个900px宽容器放下,因为图片之间有间隔,我猜是浏览器把两个img标签之间的空格当成了空白节点. 在网上找到了几个不错的解决方法: ...

  6. kubernetes(k8s)容器集群管理

    Kubernetes介绍 Kubernetes是google在2014年6月开源的一个容器集群管理系统,使用go语言开发,Kubernetes也称k8s. k8s是google内部一个叫borg的容器 ...

  7. react学习笔记_02-元素渲染

    const element = <h1>Hello, world</h1>; 上面的内容代表react中的一个元素,元素是构成 React 应用的最小砖块. 与浏览器的 DOM ...

  8. 【知识强化】第四章 网络层 4.8 移动IP

    这节课我们来学习一下移动IP. 那移动IP呢要跟动态IP区分开.动态IP是指,通过使用DHCP协议,在一个局域网内部的一台主机,就可以动态地获得一个IP地址.那这里面的移动IP是什么意思呢? 我们来举 ...

  9. 【记录】Mybatis Generator生成数据对象Date/TimeStamp 查询时间格式化

    Mybatis Generator是很好的工具帮助我们生成表映射关联代码,最近博主遇到一个问题,找了很久才解决, 就是用Mybatis Generator生成实体类的时候,Date 时间无法格式化输出 ...

  10. 2018-2-22-在-windows-安装-Jekyll

    title author date CreateTime categories 在 windows 安装 Jekyll lindexi 2018-02-22 17:47:39 +0800 2018-2 ...