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>